IMD 1.17: 21/12/2011 12:54:22 wavemate boot disk w hard disk files w((yχ1! H:k!~ > <>  :x( A(:} >[( 1  ͍ %͍͍ʢ͏͕!~# 4͕ ͍:g:s:_g:s!]~$o#~B̩1ɷW|g ͏͕%z͍͍ ͍vCPM3 SYS CPMLDR error: failed to open CPM3.SYS $ CPMLDR error: failed to read CPM3.SYS $ CP/M V3.0 Loader Copyright (C) 1982, Digital Research $021182" yڥ2 2 : 2 {2 !" " 9"@1!N y2K!dڛ_^#V*    ; A G :ž y! 4 5~yµ5 6y ’ ͒: ! OͻMD2 > BDOS ERR: $Select$Perm.$ v{_zW{_zW )8# ? w#JJ |^#V###" ##" ######" !  I* ! I* |! 6ʕ67 * w#w* w#w#w! ^#V#Fͪ' O* &! s#r#p* N#F* ^#V#F* : O}|y* %+* .}|y#* %* DM"  * s#r* s#r#pyoxgkDM* 0 MD" ! * MD$ : O&! N:  yG>O: ʐÇ* ͒ : ʨn` ~#for2 O͚" }: O* 7" 2 " : O: G2 ! w*  * !~2 ~2 : 2 : w: w |g}o' )4: O!3yoxg: O&}* : o$~w{ozg ^#V: ʏ> Û͡" ͳ* ç* r" ! ~#O&E: N/* " y2 ʹ͗ͻͫʛ* X: O~Jyʔx ʍ ʂJÍNJ# h2 G>G:~X*  IOw!x>Fwx2 2 ~: : 6: w2 ~O !>w:ͨ2 4O.5Ϳ: ! S: ͮ: ͛ͳ: < =! wW* M_S -* MD:" : 2 ɯ2 >G=O* ~~w#~2 ~wc~~p2 !" >2 * ~=2 ~2 ͛o>* w!" 2 =2 !" Û͛o͢͢' ͫ~<7 w@ͩ7: " Û: ~ : 2 : ~ * 6: p w#: w: w*@* }D> $* * T : _2 {2 " r" [  ?, d >l [ I6: <!=6 * J " * K : G/O*  * =d ## Ic S h o j y ~ Ç Ã G _ ` _ !!k2%t!" !@"[!>;>!"[ ͍! <(͍ ͍<(!ixxxy2 CONBAUD SYS; ERROR CALLED, OFFSET=+++ R| }- - * 0:8OS ~#OS : OxyG ( yOxy2"!y*y2#C `i#̀( :$!"(/:"2$ ̀(![ R>0>; y͞ ĕ x ;1 6:2':#!8! 0 y2&͚_ : OG 6# !݆ݾ8(>Fp!'~ݖw >!); (>:+2O F<2 ::&G>; >:$F(?02y2(> :ͷ >ݶ 6 ͷ F8   C0".!+zix( :(g( x >> w( y(ϋ"YS`!Ui >}ϋ~G#N#!/c>w#:#!.O G8! :2( E HIST UTL FORMAT COMCPM3 SYS CPM3 SYSVCONBAUD 048CONBAUD 096CONBAUD 192CONBAUD 384CCP COMDATE COMDEVICE COM: !DIR COMr"#$%&'()DUMP COM*ED COMI+,-./ERASE COM01GENCOM COMt23456789GENCPM COM:;<=>?@AGENCPM COM(BCDGET COM3EFGHBNKBDOS3SPRjIJKLMNORESBDOS3SPRPLIB COM8QRSTLINK COM{UVWXYZ[\MAC COM\]^_`abPATCH COMcdINITDIR COMefghijklINITDIR COMzmnopqrstPUT COM7uvwxRENAME COMyzRMAC COMj{|}~SAVE COMSET COMQHEXCOM COM SETDEF COM SHOW COMBSID COM>SUBMIT COM*TYPE COMXREF COMyCOPYSYS COMMEMTEST COMHELP COM8HELP HLPHELP HLPHELP HLPHELP HLPhCPMLDR RELDRVTBL RELSCB RELMOVE RELBIOSKRNLRELHDDRV RELBIOSKRNLZ80BIOSKRNLZ80DIRLBL RSX SCB ASMCALLVERSASMDUMP ASM ECHOVERSASMRANDOM ASMVHDDRV Z80fCONBAUD ASM(MOVE Z80$BOOT Z80-GENCBIOSSUBIOEQUS Z80XDRVTBL ASMaMODEBAUDLIBZ80 LIB/CHARIO Z80     CHARIO Z808PIP COMDTRACE UTL CLOCK RELPARKIMI COMGENCPM DATDSKDEF LIB!HDFMT10 COMBNKBIOS3SPRf !"#$HDFMT15 Z80I%&'()HDFMT15 COM*HDFMT10 Z80I+,-./PROFILE SUB0SYSIN57 $$$14!y~=W!x# ~#bxE {8~#o}oA'.`28!Ip+q*HT!J6J T ` T!p+q*T> >/Ҥ×!p+q*DM͛:̀ ̀:2:!!K:*&L Ǹ!4!K6 ͐uëYALPSID'TCELLOC$LAITINI!%cCOPYRIGHT (C) 1977 DIGITAL RESEARCH {{ { {zb{b{*9 {_zW}l&))o> \> \\ß*"!" ͟#͟Prںºx"x#"̀ں͇"1!6# y͟!h͟$h͟'h*̀`*̀`*1̀I ?! ^#Vr+sz`>>!@^#V#̀{ k͇#"/<͟h2**̀`i~#!~6͟*1Þ6͔h*1^#V#Þ͔{> \*/̀>*\ ERROR - FORM IS X,Y TYPE HISTOGRAM BOUNDS HISTOGRAM: ADDR RELATIVE FREQUENCY, LARGEST VALUE = .INITIAL = .COLLECT = .DISPLAY = .... !6 ` !6 ` !6 ` *&T` !6 ` !6 ` !60 ` *&T` !6* ` !6* ` !6* ` *& @AA I$DBD $I$BHA"DH!""@2m#}1͖-m:m#8ͺk 2#2$M 2"!\#6!z#6:z#b:m#2}#!$6+6+6!o#6!"6!"_#"X#}2d#2g#2h#2c#2z#!n#6!e#6#6!j#6!"6:m#ҹ*ͨͺ!#6:}#͑ ͖%#:d#%# :p#=:p#_HH ":S# N:"H ͵!S#6:d#<"$\( K"#&#( Az:S#:" H҃͵!"6&#,"( Az>!S#Ҕͥ z:S#ʡ!e#6:j#z!f#6:p#,:p# Hͥ :p#,2j#!c#w:S#!$6:$!$6:$!$6:"> !"H!d#"ͥ :"/!f#6:" T!f#6>'!f#Q!f#4<g:" dgA2:j#w"á:m#2}#b! $p+q*$}2{#|2x#!!$q:!$_ ͨ ͨ!#$p+q*"$ !%$p+qͺ*$$DM!|#6|#  !'!y~=W!x# ~#bxE {8~#o}oA'.`28!Ip+q*HT!J6J T ` T!p+q*T> >/Ҥ×!p+q*DM͛:̀ ̀:2:!!K:*&L Ǹ!4!K6 ͐uÇYALPSID'TCELLOC$LAITINI!ÓCOPYRIGHT (C) 1977, DIGITAL RESEARCH g gzd{ *9 Wl> W> W*"!"^l!]kl$]xl']::>2l!6!"!~4*s,r,"!~Ol!F2y* "*xT-V-^yA!~4x]> WO" Q>2y*"  INITIAL = COLLECT = DISPLAY = "-A" IN EFFECT, ADDRESS BACKTRACE READY FOR SYMBOLIC BACKTRACE BACKTRACE:%B 2!4þ *%"%:/ ͩ!4¡ :$ !4!"%!q: O !{4>!O :!{O :2*'M!8 ^#V%!t ͫ *%B :w*%#"%` Ø Ø Ø Ø Ø ͩ` *M6` !6 ` !6 ` !6 ` *&T` !6 ` !6 ` !60 ` *& @@ I$B$!!D!$"H@* ͡. ;ͣW!E# ¡ # ¬# ·@ʴʥzʖ=ʐ=|zJz?4)z z :{#:x#H!" " :{#L:x#D" L" !#6!g#6͡ :"2""! :{#u!h#6:$/:"HҊ!{#6:{#¯:x#§" ï" :"2r#:"2s#:"2t#:"2u#:"2v#:"2w#" 2{#"T#( !"6#6#6#6!"]#:g#ͬ !_#!"Y$>'")!"W$͙ :k#!l#we *W$$ DM" b" k" :a#Ҁ!@"Z# Ë!"Z# W$Y$;">'"W$Y$;"!@*"!a#W$Y$;""Z#!Z#"}O *W$$ DM" :{#" *Z#*W$"W$Ë:$ң !"W$ Y$W$;"ҝ"ͩ 2V$*##"#>'"G!#4!U$6:U$ր!V$ҁ*U$& :U$W$!$ 2V$!U$4L*W$"W$:V$ښ" "Ϳ " *W$$ W$_#;"+s#r{_$( N :a#!@"Z# !"Z# ͡ *X#"]#X#";">Pd4Ĵ%UMICNTFLUӕf`1ڠ hHiʊj 2ʜ@dBAxGV<N> xr1.VQ3@ʜ@xixp_-,>OaL, р9(ꔀ=Gm:5 ?3h( d8/7iNр\xFV,|VdY2P dNu,cT^Q !@#Ql 0N0<+? ;cAF~V<n l n(#DFeOfX08pF6T+r\V0 3j@ 6!$4k!n#6:a$ F!"6*a$M͹:a$ Z!n#6!c$q:c$a/>z!c$/H~:c$_2c$:c$!d$q:d$A/>Z!d$/Hҥ:d$ 2d$:d$!f$6*"M!N ^#Vͥ `"]#;" :e#/!b#!"X#]#@" *_#"X#*]#*"~2e$*]##"]#`5!f$62e$`2e$`̀2e$`"5E:f$ҕ:$Ҁ:o#<2o#2f$Ë:e$ 2f$:f$ҕN :$Ҥ:e$2e$:$ҳ*e$M[: $*e$M͂:e$>!":"=2"> >>!"!"5+N!~# ~2g$!"4ͩ2g$ >>!$;*$Mk8:$2"!$6:"<2"!"6g>!$c*$Mk\!$6!"6> :g$g:g$!h$q:"!h$wO!~# ~2i$—*h$&~# :g$w>!g$:i$¨!"4í!"6>2p#:$X#]#;"!i#:p#!o$62j$:j$::j$:o$" *j$M2j$2j$2l$:j$2k$2j$!l$w:l$D!o$6I!o$6: $!o$x:j$::j$Hu2j$T:*k$M*j$M:l$2m$"p$2n$:l$ʲ!l$52k$Ý" 2j$:j$0O> :j$0:j$AO>" :j$A 2j$OH!m$wO`i"">!$@ ͥ >!$N ͥ *_#}bO2 ͙ "j :{#" :y#:.#:$:{#Y:{#NH{͟O[2{#Ø:{#Yͺ"͢ ͺ:.#2.#:/#2/#%#V %#͢ %#"Copyright 1983 Wave Mate, Inc.1s>O>pLfL͸!\6 ?͸!\6͸!\6͸!\6 !b͸!\6 _ > _( w(o w(o  Ow( y  w(o ͸!5!;:;? >>>> WdI  This utility is for BULLET revision E boards with SCSI bus interface $Controller not responding, operation aborted $Winchester drive sucessfully formatted $""#:"2#!i#6:{#°*"#"">'"­!"4:{#*"!"">'"!"4" f:z#!"t$"x$͡ !h6\ !"v$:{#t$v$;"H6*v$#"v$͔ :{#]>x$H"R\ : $\ͺ*v$#"t$:{#_!#&#( &#"( f#!1#6!"6:/#/!$#: $>x$H"!{#6:{#Y:{#NH':$͟O[2{#!{#6Y*x$#"x$!g#6:{#Y! $#Aͺ!z$6> !z$e*z$&%# ~2{$ ^:z$ W.ͨ*{$Mͨ!z$4/:$p>͡ !"6?" :{#ʲ:{#_!# "( :"ڬ>͔ ~>!":R#!":%#HH :#<2#!}#> *#&~# N[2p# :p# H !}$p+q.*|$ 6 !p#6 #6:q#,T:q# A!p#6N:q#$N!p#6 ͒ )$*|$ 6,*|$ 6:"<*|$w*|$ :#w!~$6>!~$ڗ*~$&$ 6!~$4|!"6#6#6!q#6*p#Mc :q#ھ:p#*Ͳ ͒ 2p#ê:p#:¿:q#(*|$#~A<*|$wO>*p#Mc %:p#[ !#5.*|$ 6 ñ:q#1!$6#6> !$ڰ!$6:$<2$O>/:$!$O!J *$&*|$ H~G:$¡.*|$ :$w[œ !#5:$2$!$49:p#[¼ _ :q#!q#6+~. 2p#Oc  :q# :p#* Ͳ ͒ !q#6+~;= 2p#Oc = :q#$ *q#&$ *|$:p#w!q#4 :p#[H !#5.*|$ 6 *|$ 6å!$q!$6> !$ڏ *$&> :$ˆ >!$4l >:q#<2q#O*|$ :p#w:p#?± !d#6!$q!p#6?!$:q# ͒ û 2p#:p# :p#]H!:p#A2$O>!:p# PRTMSG = Y PAGWID = 4F PAGLEN = 17 BACKSPC = N RUBOUT = N BOOTDRV = A MEMTOP = FF BNKSWT = Y COMBAS = C0 LERROR = Y NUMSEGS = 01 MEMSEG00 = 01,69,00 MEMSEG01 = 0D,84,00 MEMSEG02 = 00,C0,03 MEMSEG03 = 00,C0,04 MEMSEG04 = 00,C0,05 MEMSEG05 = 00,C0,06 MEMSEG06 = 00,C0,07 MEMSEG07 = 00,C0,08 MEMSEG08 = 00,C0,09 MEMSEG09 = 00,C0,0A MEMSEG0A = 00,C0,0B MEMSEG0B = 00,C0,0C MEMSEG0C = 00,C0,0D MEMSEG0D = 00,C0,0E MEMSEG0E = 00,C0,0F MEMSEG0F = 00,C0,10 HASHDRVA = Y HASHDRVB = Y HASHDRVC = N HASHDRVD = N HASHDRVE = N HASHDRVF = N HASHDRVG = Y HASHDRVH = Y HASHDRVI = Y HASHDRVJ = Y HASHDRVK = Y HASHDRVL = Y HASHDRVM = Y HASHDRVN = Y HASHDRVO = Y HASHDRVP = Y ALTBNKSA = N ALTBNKSB = N ALTBNKSC = N ALTBNKSD = N ALTBNKSE = N ALTBNKSF = N ALTBNKSG = Y ALTBNKSH = N ALTBNKSI = N ALTBNKSJ = N ALTBNKSK = N ALTBNKSL = N ALTBNKSM = N ALTBNKSN = N ALTBNKSO = N ALTBNKSP = N NDIRRECA = 10 NDIRRECB = 10 NDIRRECC = 00 NDIRRECD = 00 NDIRRECE = 04 NDIRRECF = 04 NDIRRECG = 10 NDIRRECH = 08 NDIRRECI = 01 NDIRRECJ = 01 NDIRRECK = 01 NDIRRECL = 01 NDIRRECM = 01 NDIRRECN = 01 NDIRRECO = 01 NDIRRECP = 01 NDTARECA = 00 NDTARECB = 00 NDTARECC = 00 NDTARECD = 00 NDTARECE = 00 NDTARECF = 00 NDTARECG = 04 NDTARECH = 00 NDTARECI = 01 NDTARECJ = 01 NDTARECK = 01 NDTARECL = 01 NDTARECM = 01 NDTARECN = 01 NDTARECO = 01 NDTARECP = 01 ODIRDRVA = A ODIRDRVB = A ODIRDRVC = B ODIRDRVD = B ODIRDRVE = A ODIRDRVF = A ODIRDRVG = A ODIRDRVH = A ODIRDRVI = A ODIRDRVJ = A ODIRDRVK = A ODIRDRVL = A ODIRDRVM = A ODIRDRVN = A ODIRDRVO = A ODIRDRVP = A ODTADRVA = A ODTADRVB = A ODTADRVC = A ODTADRVD = A ODTADRVE = A ODTADRVF = A ODTADRVG = A ODTADRVH = A ODTADRVI = A ODTADRVJ = A ODTADRVK = A ODTADRVL = A ODTADRVM = A ODTADRVN = A ODTADRVO = A ODTADRVP = A OVLYDIRA = Y OVLYDIRB = Y OVLYDIRC = Y OVLYDIRD = Y OVLYDIRE = Y OVLYDIRF = Y OVLYDIRG = Y OVLYDIRH = Y OVLYDIRI = Y OVLYDIRJ = Y OVLYDIRK = Y OVLYDIRL = Y OVLYDIRM ]@COPYRIGHT 1983 WAVE MATE, INC.͢ Invalid selection, please reselect drive  1 Ͷ SB zʗ͢ Multiple formats available, select by number from the following FMT type sides tracks sectors sect-size den step-rate ###^#V#xz ͱL~ ͢ Enter number from first column to select a format: ͮ ͛ !! #~f)#~0)) )=)_S8 NF{ NB |(n fF(<"2 }2< ~N_P`hB S4 {2; Q<:02= y{ "6 :. O͵ >͵  :/ 82- 5͵ "͵  :1 1( ͵  *2  *4  *6  DF S͵  F:- ! ! ##~O͵ #~O͵ ͢ MS :› nf Û ,  }00'͢ Requires CP/M V3.0 to execute !) w* ! R0-͢ Incompatible with this CBIOS version  ɯ2: ͢ Drive selected is :. O͵ :͵ ͢ , Confirm formatting of this disk: ͮ Ͷ 8Fw!p"@ *6 r"> !P>N >>w#2>N>2*  >>w###:* w#:= w#>w#>N >>w#:7 O:6 G  > >w#6>N!* ~4!; 8>N!"@ :*6 "> !(>>w#>>2* >w###:* w#:= w#>w# >>w#:7 O:6 G  > >w#>!* ~4!; 8>w#wT]:/ :0 >G (1͢ DRIVE NOT READY, OPERATION ABORTED " 7w(3͢ CANNOT FORMAT WRITE PROTECTED DRIVE! " 7:1 (P:/ (@͢ DISKETTE MUST BE DOUBLE SIDED TO FORMAT DOUBLE SIDED 7>XWAO(O !'+O(| 3͢ CANNOT FORMAT HARD SECTORED DISKETTE " 7ɯw(͛ ͛ 2: 2) !] V ~X.  2+ ͠!) 4!< < ͢ WRITING͔ :) O:; G:+ [> *@ qw!/ Gyݾx8!d V >. (2: ͢ WRITE TRACK ERROR F!+ 4FN >X2) :< G:) ~.  ů2+ e!) 4:: :+ !/ 2* !* 4~*6 +"t !p V >. (=2: ͢ *** READ ERROR AT SECTOR :* z ͛ ͩ ( ͯ  :* !; F!+ 4Fe͢ VERIFYINGYCopyright (C) 1982, Digital Research@ BNKBIOS3 SPR F500 0B00 BNKBIOS3 SPR 9500 2B00 RESBDOS3 SPR EF00 0600 BNKBDOS3 SPR 6700 2E00 59K TPA $$$$$2:V>ͱ\/y2"{M x* ys1!5«6!5 ,6 !~'`8w+~<'`8w+~<'$8 w++4 #~>&81*2(&!91:V>Q\y QO>  T!" {>91:V>Qk&) ~#fo(++N^#V#S ^#VQHx> >2L*W|o&>~!B=:L( >}ϋ>2VCW/y A!A:>2!+} _ > !+} _( ow(:V2:UQ:Qx:V ɯ2VSF"M C*R7̓!}͓6 Ͳ*R* o  o  O y ̓!sͲ!y7:y? >@@+@@_@?     ̓!}͓6Ͳ`x ( (?4 4!91:V>Q͐Q4YŤ{>>:[(>z >2[sI1[>>>0{IM~G#N#bb2[\!\~Q(R4((6#6!b"^"`#4*`!bR S`*^w!RbS^{IMsI1[>WsI1[:[Gʉ :n>:H(=ɯsI1[KmxH>( y2n*qx2n"qnBc!s"q{IMssR!s"o>>(y>2n (y(:Hy .:\*r0:( !F(y:]ɯCRT LPT CEN 1!\(5[`(( #5!R bS` (>C:n(:n(*oq:n<2n#"on,(!W! W! K>Q>Q>QCCP COM !:LAO !ѕ*N!֕*P2Vc2!"< !.!**)z| **)z | ~O #>/<033O _ W{**)0I(\| ***)>I| h&)))~<z~Č > >w̓͝W1͝Ͳ>Q>!2"*2"!!*ÑÔí òlDotyÐÖ0Ä&Ù+ôùý6ÀYi*oÃ1Oj$|gÃà à ÃBB+"}{_}o>2~77ø~7"9:OG#Q{ozg# ""!2*%DM**ѵ+)) H~#+}#<:<ʲ<77:<ʢ=2(*f*(}DɯQg"(>QKQKQ>Q"%Q!*$K*"x!*!@$@hK\K:K ~#~ w*NK*NK^#V#N#F!x>QGQx3ڰbڼqҼo5p5"""*!yb! ~G*!NKկ2}!,"**NK6 :+OK2$^#V#N#FxNp:$p:Gjxj Y# A>QFQKK{<<ʽ! ~6 69BK! OS654321$Nwy!"(9"f1f! Ҕ2! ~#foCOPYRIGHT (C) 1982, DIGITAL RESEARCH 151282 title 'Disk Drive Table Module for CP/M V3.0' ; EDIT DATE 8]^^__̹`۹`Y YZ'Z6[E[T\c\]UUVVW͸WܸXXP QQ(R7RFSUSdTsTKMMNNηOݷOP9 ;=)?8AGCEeGtI')+-/1϶3޶57̓(2Y!K6Ͳ*̓!K6Ͳ*̓!K6 Ͳ!Q*̓!K6Ͳ* 2 fVr%u:Y!zʮ Ү=( ))Ҥä:P=O 0stu>O>2Y>>>yO>!~ѧ##^#V~##~##~6#ð}$(ϋ y(ϋy(ϋ[d 9$Cgteta eLk&k ( H6#:P= _Gnf ~:G!~( =  wTg( xʹ>> !=gw(>>"S!= >}ϋGqxbmʹ(>ʹWy> ~~ F8 >C!#  CǮ"Ů!® C׮"ծ!Ү>=x( :~NF(N V( yP(0 O90yݾ8~2G=:>xV(> y~ʹ~y~>ʭ6#x G=:,ͷwO F!!~>>!>!!>!OS3 WRITE/VERIFICATION ERROR ON : 0 !~݆ݾ8(>6w4~ ݖw WFOW!F~(~( y  6ͷ y!66~w ~#(WF~w#ͷ ɯͥ~A2!xͥ ( \   BNKBI  ͚I~w ګ( !cͷ ~w ګ $W n F>w#!^6ͷ !^*z(S[~_W"wn f \͇~w WcF >w#ͷ 6͇ 5!G6]T  N>(#T~(0Os r :Mw:Nwww':G!N!T~(~ :M ɯ2ww~!*~w>2>2yUsN1͑22Qw> ; u666*R:UG xʭ ~ w>2>2{N:G!!( ~ u/ o6(G:P64ݖ0~,ګ ! W(=c yWF>w#[R:UG xʭ  = R05 !!RutT B8 y!wwl!( +| >>!MsN122͑l#N#F#~#foq#p q#p! ~#fo~w~O#~w#~w#~w#~w#~w#~w ~!_~w6!4(~!S :2G):W y2S(!l:2G:2:S : :_: xG!~#fo~((fn^#V>"G~O#~U~檩˿#6=sN122͑!T!~#ʤ:M2GW y2!62>2ERROR, floppy disk drive version does not match FDDRV version is: DRVTBL version is: 6!, Wave Mate Inc.:M!< = ͑*R(!!!b!!~x:Mw!Twwwn0Һn`nH"`nHb2`Copyright 1983"Z\n rbnJdn0N^f=_!~#FĮď@ DE E 77 E ׵A4!p>}!h}>>:2>x2B!;= xxx:2Gx2L!D&>O>2H!T(!_=!ed CBIOS V06g CCP.COM too big for buffer in boot moduleCCP.COM Not found. Press RETURN to retry: CP/M Version 3.0 with BULLET SBC Bank2Ui`#z+n&*L&)~#fo~#fo2M2Tɯ BIOS ERROR ON : T-, S-^!d|G!""! "!@""!Y1>Qʹ ە!^#V#{(++~2My2L+V+^ Èy2Li&) ~#fo{!~2M!~#foCNCPCR:Vڗ{>2#×{u:#<u֐2#*=‡*":*}®:=z::<zyx>2*i^#V+ d!K*}@x*)): K:) O "!w [O?WGzO:VxGyOGxwq*}}ʴ>2d:#ϒ>29~2~2#!   )xð*}*}"*x"xm*^#V* s#r**s#r*:Y4Y̓**~#ngx* s#r ^#Vuua##)u""xx!"""XuC*~<Α*":!:*}*"x"*"g*3:= :Oi :=H:Gi a6:G/O**W v:T=ҍ aʚ~6*:X)u!:T>qvk֐!:6>X*{Q:_2{2Ē"͂y"X~<#cdfg!"()*N!rq)u!N!g)uz<*)"!"t:X*:w:w#:w*2j*t}D̓¡>2{ͱԇ߆?w~¾¾ʎƎ>w͙=2͜w{:wÚy~̓ʑpá!6NwͧBpͧȓÚygsrq͐-~͜w{vͤwS)u_ͤw̓~?ww͐s|-~?wF͜w{pN͆{p# Þ͐*6!{¿?w~p|*6 {>2ͱ݇ԇ߆ͷw*o{q͋z"@x6ȓ͚y|Xwͤv͋͗{wOw~<: g~w#w#6##)u͋z@x * g~?G++!o#~>T}! 6*x*#K"tG*~ xrq͐-~xą|@x˄7w||(x͚yS{ʀwz :<RyHͥu:>~c!o#~E^#V)G#~#~!~ b k##N#F#^#V#~#fo~o||2{2g*wzʪҢÞ+}*#}o|g:Ot*s#r#w!~w/j~@w/j/Hͥu*e>=)_g:0q"öyk*w)*c)-~͐ͤ~À{k*s"t:;:rq2͚wù͚w„͚}/_|/*eW}_*c"e}o|g"c>2{—>2—{͇}|ͱ* «>2͙wBp+}Ҋ:w͚yAyP{ 2W>O2t|øt͐R~*e):rw͚wcw2ZxTx͐-~~y3͗{@YsY̓YׇYͅ:߆yAysҊ:@Ҋ@Ҋ$}̓x͚Ayw=:t<~?¯kÉ?w~?ʾZxTx͐ډ*>o"͒y"!y{:O{|"Ý͐6}͚ ~2|Aysv@NN~v$}̓W+}vwx̚yv$}̓rrͅ:r߆>2+}Ay@2rq!Z2!"öyg:2Tx͐-~:ʹ>2<2~!w: >2*6{|~yOw~<w:*)u@x uq:G*g`~!x_<_@*oyx<:/G?w~##~? 6Kx@?wF6##N6{⇯2tp##q:#*~w{>2t*p@x! ~*"vx@x*w# )u 6#͙̇yNu#FxT]## #~ ȷ  *4# ' 4!u *~^ ^33G# Pv:dv6 y2@x !׏)u#w*~"{҆!Fw䆨҆̓҆:wx̚y":>劯2x̓*~wć}"̀uzz!~$6:03yyix"!~6*e>=)Q!QX@x˄ |>2t ˄!!q#p#w2wW*ex_3uҫt-!s:!xQz*~:t<œ. ʩ.ʩAytrqr##st<}rqcN! ~态O>G~G!~G~o>_yG~.|°! w:cky[!x?[! ~ʤ͆{[͗{PPvqqO-~á=.:t<ʰ! Vq##~_@wڏͶy:WMںʛ>úͶy v>TJy:!ʷ͞ux!ǃw4 σPWރPtÂwtÂw*!!~~#~O~#FxsO s#rv:(„y==„*!^W*y^#Vx7=2wͼyկw#KWK*"Jy vT͞u*:["+xySXw:ڜq:tvʺ!uʵ>2tͤv2тO vDM͸}}ނ>rq""2:2* :::29x:>:>*ڈ>F6:_/G:ʧ:ڨ|OͤvG:_OvvzW{|:*}|BKNz zyG:!vqq:tvqtvvqvMڂw?Ͷy v>T͓uÂw!">Âw:G:O:h=27ryy/W!:l=:t<>w##~2 4~?ɀ{¹:<ɀɀü~AyXw2rqKx:w++~=wvq4͗{O5:2Xw!"*>o+"!y *!b"{|": r#~?w#>r# L=J Lvx }wȓbxt?w~O ͆{ڀ†wŒ~è# # x ͗{w w@x ~wbx͐zÚyy|!x>w~6:6~#+w#w+~;wɯ2txKxyOFq-y~l?wNp~{g:ʓ~|{(x }ȓ|ˆ~}ʀ{H~È~w2xą{ ~)u:@~Ow~#w͚y|ʀ{ô~{bx_++V@x* )u͗{Os++ry~Gw#}* #~$%~+@x*9~>  #>? ;~*~ w-~xą|H~"0~ *{{}Ċ}H~|E}{ʀ{@x~›}:}6¦}w͚y̋zȓ|Ç}PY*{z}BKNz}yʺ} Nz}ú}2: |*~w {|*" {|w2>|{ʄ}@x~k}:(xs~}*9~~}Ê}s~}ԇ~}ͅ<}{G:<|2x|# W|:<­|:||22tG?|z>Grqx|~|:|2Ô||##~|*$|*">2̀u2kº|zyʺ|**|ixҺ|@x:O~|2~W|W|:|2Ô|yʛ|?ʔ|x ʔ| ||̷||Ô|N:rq:/GyOOwA +¬{ ¢{y2:x¹{o&:W>OͫwE:ڟ{?wN/*"y2ͦ>2{ {zx{wzzDM*w6# x {*ow**ws#r̀u*i6#6z*}"zywz@x*|<ď>!8{>8{> t{>n{ͦzvx8{ ~*own{T] KKͦzz*w"wͦz"w@x :zNz N#Fyz*}|hz#ðz*ͫw# y6RyXyu{*q6!"z@z**#"xz:&z2͒y:Èx0z:y+yÒyy<_W`iͫwDM*w ~bzNzpzwzDM*wey ^#V#~2u>ây9x͆x>!"*y³y*X*ÿy͂y"*g*K!t~<:wbx##>w#wvyy> rq!~#22xxZw*q>ww:c x*#*is#r*xx:!:)we:O!w*c:Oͫw}@x2xæt ~xát*g:o$*~Kx6?w~wKxw**i{#zixr+s{Ow:w:Ғw4~:w?wr##rp# äw |g}oìw*g #wG ¾w1w*qw:*w**xw*x> rq 2":O:G2!w*~zWw+ !wz?w#~*!* *Gw!Ow~2~mw͗{O~~tw>2?w:2g͝vDM*0MD"!*MD$:Oëw!N: «vG>O: vùv*v :vn` ~#foͤv2Ov"}:O*t"!s#r#p*kN#F*m^#V#F*:O}|y9v*t+"v*t}|yPv#9v*t*DM"*ks#r*ms#r#pyox*kw#w*mw#w#w>2'åu2*OͶuyڲtòt*ͫw"w4#4#4u)u7wu u# u w#*uJ|^#V#"i##"k##"m###"o#"q##"!s )u*s!)u*|!6~u67rrorFile Exists? in Filenameòtòt>2a."t:2:<:55;:2ɯ22{_zW{_zW )t7CP/M Error On : Disk I/OInvalid DriveRead/Only FileRead/Only DiskPassword E)"!z<~rqs^#V#N#FxN:oʲq̀õq(l# Þqkrqy< q<q<%qzj|rqjͷjrq6rq9rqMDÌl:oq!6!hq: ʚkntk2 rq6k2t>rqz<*9oʌp^m: p~x p)jpln:*tp:qpp>n*(t+"(tw++m2+tn2+tmlpll!" >2+t2*tnjlx.p#NzW:qlp:qn!2qWl!q5=p^mnx^pzn:qmp:*t;m#wOml:qtm͂l^m2qn¢oů͠kmo:q!ڽo*(t~mm5WlèooljlmMp2qͨmxo*(to+wo"(tjlnkn o!%t"(t^mm-o:*tm$nPo:<\o:qW:m2qxMo pso:<9o>2q:*t9oxm~+qp’ox2q:*m*&t~2+ton#"&t!+t6Mpn:qW:m2qx pͺm*(t+"(tw p o:qn>2*t2q:n*(t:qn+wn"(tͺm:G:q:+t̜l2q p p5nlm*(t~on#"(tMpšn*(t~`nlUnomjn*(t~#"(tÑn!*t~6sn!+t6m:+t‚nxonڊm{2Óml#wm:2.tm+m:.t2-t!%t"(t2*t!r"&t!*t~4:2-tlԂl:qGlͳmͨm^m2+t>2:2q*N#G2qm 2qmGH)u+6:2,t:!-t km:,t!k+m*(t~Lm#Bmxzm:*t:qm*(t~ʓmOlrl k k! O(lÌl*(t~2*t*}ʷj!#¶l!""÷j:_:*(t#wlxH!r)u6"&t:!rq mx5~y l5 6yj(l^k@Ol:=7l:ky k:Ill k:=lel:q zz#k͂l:!q k G:Ҏk>xʝkʝkw>ɯw̩kz:»k!>wɯ:=zxzz:qk:G:=/kͽkxk:Āy!4 škn!6@G:xkj: Pk: whMi hh 2i*7iw#6?#7i .,:;[]=<>|!?i]i45#Ria{ii_p# li si si li lisi:¬hMihAhhͱ\/y2"{M x* ys1!5«6!5 ,6 !~'`8w+~<'`8w+~<'$8 w++4 #~>&81*2(&!91:V>Q\y QO>  T!" {>91:V>Qk&) ~#fo(++N^#V#S ^#VQHx> >2L*W|o&>~!B=:L( >}ϋ>2VCW/y A!A:>2!+} _ > !+} _( ow(:V2:UQ:Qx:V ɯ2VSF"M C*R7̓!}͓6 Ͳ*R* o  o  O y ̓!sͲ!y7:y? >@@+@@_@?     ̓!}͓6Ͳ`x ( (?4 4!91:V>Q͐Q4YŤ{>>:[(>z >2[sI1[>>>0{IM~G#N#bb2[\!\~Q(R4((6#6!b"^"`#4*`!bR S`*^w!RbS^{IMsI1[>WsI1[:[Gʉ :n>:H(=ɯsI1[KmxH>( y2n*qx2n"qnBc!s"q{IMssE CRT LPT CEN 1!\(5[`(( #5!R bS` (>C:n(:n(*oq:n<2n#"on,(!W! W! K>Q>Q>QCCP COM !:LAO !ѕ*N!֕*P2Vc2!"< !.!**)z| **)z | ~O #>/<033O _ W{**)0I(\| ***)>I| h&)))~<z~Č > >w̓͝W1͝Ͳ>Q>!2"*2"!!*ÑÔí òlDotyÐÖ0Ä&Ù+ôùý6ÀYi*oÃ1Oj$|gÃà à ÃBB+"}{_}o>2~77ø~7"9:OG#Q{ozg# ""!2*%DM**ѵ+)) H~#+}#<:<ʲ<77:<ʢ=2(*f*(}DɯQg"(>QKQKQ>Q"%Q!*$K*"x!*!@$@hK\K:K ~#~ w*NK*NK^#V#N#F!E }!,"**NK6 :+OK2$^#V#N#FxNp:$p:Gjxj Y# A>QFQKK{<<ʽ! ~6 69BK! OS654321$Nwy!"(9"f1f! Ҕ2! ~#foCOPYRIGHT (C) 1982, DIGITAL RESEARCH 151282 title 'Disk Drive Table Module for CP/M V3.0' ; EDIT DATE 8E Y YZ'Z6[E[T\c\]UUVVW͸WܸXXP QQ(R7RFSUSdTsTKMMNNηOݷOP9 ;=)?8AGCEeGtI')+-/1϶3޶57̓(2Y!K6Ͳ*̓!K6Ͳ*̓!K6 Ͳ!Q*̓!K6Ͳ* 2 fVr%u:Y!zʮ Ү=( ))Ҥä:P=O 0stu>O>2Y>>>LOADER y; !91""|0!~ʞz=_: _* ""*og*%|}D S#N#F:ʒ#4ʝ^#V{‚:¿*.~w*DM!&_*.& >k s#rr+6.""1*D`.45. F.~. ^#Vx>`. s#rz 6#N#fi%$g1:=<@v_}v=p{_3;{<g"T=X3*j ~P#~R#~L{gbk#N#Fk$&Zcx {~#o}o1!;!"Ï:= w*wWx ~#&*.~s*"ѷ\ Cannot load Program 221282 COPYR '82 DRI <bHA$@DH   A@!" $$@1-! j 1".~2.~2 :Xck*kͮ  b < .~=>$.w.6#w.6#w.61.~  .~~w@.p T~º>+~.~~! yͮ Ë.~~w2g !PROFILE.S !+2 !  +~d {   O! w+w+: =w! 5 c ʋ  :p  m>> ͧ  N Ĩ –.~+w.~2  9 : ! ~##~ !7 : !Կ : x*l " !ZXچ! 6  zz: 6 : %2p  ͆ : =̀ 2r  DIR TYPE ERASE RENAME DIRSYS USER u"Q}:\=p:r Aæ R ÂN ͙ʸ} !M 545 x ]  ̵ 6 : oG! ~怹>2M  xf>:ͦ ͤ ͍ ͤ f ¹2 lf   ͫR  L͞L I *  *  A }_Yl !ͮ ͒6 \&đ %* "l ͍  ûȷ45: w ? A I N   SUBMIT COM ! ͮ ! 6 #"l  !cͿ  O!:r :ͦ ͍ !~B I !pͰ ^#VCOM SUB PRL y!cͰ  î !" * %.2P#ͮ !g 4*l +"l ͷ 2 "Qx2Sl "Tx2V!q ~ :p ͆ .ڶ2* og$2| .w#w#w#w.~ .w#w~?w; ; ! ~#49 w#~$ A  < > _I  ! 6 ! ~#Ͱ 6 m   _  ! 6=  { *.pѯ:r x , \<=!Ͱ =ɯ2 \s 2 ! D ;! : .44 #4"l ~[* 2 a7 {7 w!Y #! *l "l " ~ U #D ]T!̷ 6*%.w#w!} 6 r 6 #w.6#6 #t#6.wo*.s#r.rͧ ̧ m . ^#V45+ w#w.f.5\A "l " l |F# !( | !( : x. +"l ! ͮ   ͮ ~!G8 * ~;#1 կA *l ~:g X #I ѯ*l  *l ~0څ :҅ q X x<Ü AX QX X ~@#~:k #^ *jT~# ® wy#ù ! 4 : !Ͱ ~@*h~ yw y/w*hw*h~I E> ͦ > æ % 0  < : ~ȹͦ #* A !g ~6*  * >? A *l " ~0: :: q "l x~0 xG#Gs : &͘ ͤ &ͦ %˜ >  Ʌo$>?· !  > # ͮ x> # ~ Enter User #: $No File$ required$ERASE $ (Y/N)? $ Press RETURN to Continue $ (User 0)$NON-SYSTEM FILE(S) EXIST$: $$$ SUBn0Һn`nH"`nHb2`Copyright 1983"Z\n rbnJdn0N^f=_!~#FĮď@ DE E 77 E ׵A4!p>}!h}>>:2>x2B!;= xxx:2Gx2L!D&>O>2H!T(!_=!1_ ÕCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321;Zx0NSun$Mon$Tue$Wed$Thu$Fri$Sat$::Enter today's date (MM/DD/YY): $Enter the time (HH:MM:SS): $Press any key to set time $Strike key to set time$ERROR: Requires CP/M3.$ERROR: Illegal time/date specification.$1_ 1_ ͓" * }! /* |! Hs1" 1X" :]C:]C* DM C  ͜o&" !]6m:] $ m:]S"͵.f  -=d >!e Җ. f -\! "{ *{ "} ! 6*} ~2 .*  -Ž͵.f   -§d >!e . f -! "{ *{ "} ! 6*} ~2 ͵͜o&" .* ## - )2m.  -*! 6 ̀ 2͵͜o&" .*  -ZI2ÂR͵1_ j͵v !_ q*_ &!a p+q*`  !c p+q*b    ͥ ͥ! q: <2 O*} : w! p+q* ~$7* : <2 O*} w* #" ! q: 0O! q: O8: O8! q* MF:! q* &! ͚ K8* &! ͚ M8! q* Mr/: ±: ¿! 6: <2 O*} ~2 : ͨ: 0 ! s+q! 6ÂG: Â: : H2 /Â: 0! wAÂͨ! : #~! HaÂ: ! s+q+q! : ʀÂͨ* M* ! s+q: 2 : * &) >; H: =: * ! ͚ ! s* ͜ " : ! q* &! ͚ ))))* &͜ } =2 : 2 .! 6;* & ~2 /* e2 /cNe2 : ! : HxÂ* &) : N_!m͹ ͒ * & N͏ * M* ͏_*{ #q#pO*{ w:;eO*{ w*{ ~: : :;e2 *{ 6-:;eO*{ w! s+q: ! ! 6N!m" : [!n"   h  +s#r! 4E! 6 >! һ: =2 ҝ! 6* &) : ͎ ! ҸÃ*{ ~2 *{  ~2 *{  ~2 *{ #^#V" +!͚ ! s@! 6: >;! H ! 6~* &) : ͎  ! s+4: O! DM  * M͗* M͗* Mr * Ma* Ma* MF! p+q!" * "{  "} *{ ~° ͼ! 6: *{ ~~H ! 6*} ~2 * &*} " Â! 62.* DM -  ̀  ͥ! 6>! B * &  Nͥ: <2  ! r+s+p+q+q! 6: =! ڊ * &* * &*  ʀ >: <2 W >_ogDM!>))덑o|gҳ =¡ DM!>)) = O{ozgi`N#Fogo&og_{_z#W0ed CBIOS V06g CCP.COM too big for buffer in boot moduleCCP.COM Not found. Press RETURN to retry: CP/M Version 3.0 with BULLET SBC Bank2Ui`#z+n&*L&)~#fo~#fo2M2Tɯ BIOS ERROR ON : T-, S-^!d|G!""! "!@""!Y1>Qʹ ە!^#V#{(++~2My2L+V+^ Èy2Li&) ~#fo{!~2M!~#foCNCPCR:Vڗ{>2#×{u:#<u֐2#*=‡*":*}®:=z::<zyx>2*i^#V+ d!K*}@x*)): K:) O "!w [O?WGzO:VxGyOGxwq*}}ʴ>2d:#ϒ>29~2~2#!   )xð*}*}"*x"xm*^#V* s#r**s#r*:Y4Y̓**~#ngx* s#r ^#V1bCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321NAMES~VALUES~HELP~CON:~CONIN:~CONOUT:~LST:~AUX:~AUXIN:~AUXOUT:~CONSOLE~KEYBOARD~PRINTER~AUXILIARY~AXI:~AXO: &+07?GPXbgkXON~NOXON~NULL~50 ~75 ~110~134~150~300~600~1200~1800~2400~3600~4800~7200~9600~19200 #'+/49>CHMRWCOLUMNS~LINES~PAGESIZE[]=, NONE 50 75 110 134 150 300 600 1200 1800 2400 3600 4800 7200 9600 19200"$*&("*&(INPUT $OUTPUT $SOFT-BAUD$SERIAL $XON-XOFF $Error at the '^'; $Error at end of line; $Invalid number$End of line expected$Invalid delimiter$Invalid option$Baud rate can not be set for this device$Invalid physical device$Physical device does not have input capability$Physical device does not have output capability$Physical device does not have input/output capability$A NULL device can not be assigned to CONIN$Ambiguous assignments to a NULL device are not allowed$Physical Devices: $I=Input,O=Output,S=Serial,X=Xon-Xoff $  $ Bad Logical Device Assignment; $Physical Device Does Not Exist$ $File$Null Device$Current Assignments: $CONIN: = $CONOUT: = $AUXIN: = $AUXOUT: = $LST: = $Console width set to $ columns Console page set to $ lines $CONIN: = $CONOUT: = $AUXIN: = $AUXOUT: = $CONIN: = $CONOUT: = $AUXIN: = $AUXOUT: = $LST: = $Physical Device: $Baud Rate: $Characteristics: $PARALLEL$Requires CP/M 3.0$Device Reassignment Not Supported$Enter new assignment or hit RETURN $1b1b͏}0͏|HX "g:>gH|!"}Z :: H:H|b>g–X͘2e͘2f.x*gDM -²A/;SX }h2i !~6 *i& 6~A/!l6:i!l5*l&~ Nͬ *l&~ w:l<2l :i2dbv!q*&! p+q* ! s+p+q* : w#6*  * #" N#Fy ! q: 2!61!q:2!61!s+q:2!6*&"1!r+s+q:2!6*#s#r1!q:22!q!6*& > >*& :R :!4, !r+s+p+q+p+q͐ !#6 *~ *~2#* M# 2!'6:· :'ڪ ú * M# 2Õ v :24 :22&*~2$!'6*~2# *~ P *N! ** =2%!&D !'6!6:&!A :': !4# G *64 *:$w:}{+s#r͐ :z *}#"} !6:#2(O* ~2*&*: !(4*:(w*&*: ¿ *(&*~2Ñ *6*}~2 ̀ :2!!6*}#~2 !!4N* : !'6$ *!&*: $ !'6!4N*} ~2 *&*}~2 * M# 2:>!H} !4N*} ~2 * M# 2L :2}{#+s#r*}N# 2!« *}#"}Ð !)q:)a :){ :) :) H H!-s+q+p+q:-=2- **:,w**#"* !.q!76*b"3"5:e( !e6(*d&*e&͈!1s*d&͊!2s:.:.Ha *}+"}p :}++s#r !/6:1!/ږ *3"5*eMS !/4x *2MS :7ҭ Xó /X:e?Ҿ *.M!1 ^#VFXG UXG jXG |XG XG XG XG XG +XG aXG XG    ( !8q!06:8!0{ *3NH*3#"3!04\ !06:8!0ں *5}§ !76^Hì  H*5#"5!04ƒ !;s+p+q!"<!;>w *;M!<+s#r*<9+s#r!>q!"@}2?>!?3*?&m ~,*@DM*?; "@!?4*>M*@!Bq!C6>!Cp*B&))) *C& NH!C4H!Dq*D&)))  ~2FO>ҕ!F6!E6>!E*F&Ͳ *E& NH!E4š!Gq!I6*G&)))  ~2H2HIH!I4:H2HOH!I4:H2H'SH!I4:H2H>XH!I4:IR H!I4> XX:e2J(r!J6(*J&!͈!Ls+6!J6*K&))) ~  *KM? H*KMq H*KMX!K4+~!L Å!J4Ê!Qp+q:e2c(!c6(:c _!͈!es!c6>!c/*P)"P*c&S w!c4 !c6*c&))) ~X:cQX!c44:c2f!R6!d6+6>!c*c&S ~:f!cҝX%X !R6*cM? H!d4:e!d6 DX!c4k:b!R6OX:RTX `X"Ͱ"gxX*gDM$Ͱ"gX*gDM&Ͱ"gX*gDM(Ͱ"gX*gDM*Ͱ"gX*gDM !jp+q>!Ҁ>m !k6:=!kڹ*k&*i*k&m w!k4!k6*k&))) ~ !l6>!l *l&m *k&))) *l& !l4:k!k4>>þ>!sq*s&)))  ~2u!  ~2v!6!6::HHUZ :… :’ :°:u*s&)))  w::u*s&)))  w>!2:2:u2t2t *s&)))  :w.x*g -*s&" "wE.x*g -=S!{s+p+q>!{_ !"|!~6:{!~ڵ*y~0*y>9Hҏ !|ͧ*y~0_"|*y#"y:~<2~j>!| *|}!q*&!d͈!s^!dͲ:!s^! ͈!sn&ͫ:!s>!":0OH>!>#H?:0OH:0OH!6!6::HhZ :… ::ʝ hZ :}+DM*I=2*:: hZ :}+DM*I=2*S͘2e͘2f X:e!g:"O!C ^#VXUU$XUU/XUU:XUUEXU "+.7:*MͰ"*DM :2::Hқ*MS:::H:H: HI : !6!6UZ :O! ~2:J:- G:"= G*M!6#6>!p*&m 6:<2R:/:}+DMn2:— *&m 6:±*M#::H:*}~HH!6:*}~,H*}#"}:/UZ p::Hd*&)))  >\" $ a ::Hҩ*&)))  >¡& ( æ :":&H*&)))  > *M *&)))  >  *M !q*&)))  ~2*&)))  ~2 PX*M? cX*Mq vX!6>!:2¸*&ͫ DMX !6>!ڵ H:<2:X !6>! H:<2:<2m!p+q::H!6$!6*DMn2:< :J*M:\*M#a !6!6:€!"b"}Ï!"}+"b+~2dZ ::H:H!6!6::H:}+DMS@::S @:7:/4 @sS!p+q*~ *~ Hk*#"G*~w>>_ogDM!>))덑o|gҡ =^#V))) DM!>)) =¹_og^#V) _{ozgo&og_{_z#W~rrorFile Exists? in Filenameòtòt>2a."t:2:<:55;:2ɯ22{_zW{_zW )t7CP/M Error On : Disk I/OInvalid DriveRead/Only FileRead/Only DiskPassword E16OCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321ERROR: Illegal Option or Modifier. $File Spec Limit is $ERROR: Illegal Global/Local Drive Spec Mixing. $Requires CP/M 3 $ERROR: Options not grouped together. $ERROR: Illegal command tail. $No File $1616|27}27:70:7H҂0uÅl92888,T28!868͗6:8:80u:8@I #0uä9 ͉!8͎28*8M)*8"8!"88͎28!86>8͟6:8HҌ!\6?\͢28!"8:8n*8#"8Ͳ28V*8DM!*8) !ͭ6Ҍ!86!86!"8:8*88*886>~6:8:8/!8H͎ !86!96:8͌$e.8͎28×*8"8:o9/:8/HB0uv o&!8q*8& !8q:828!8681m!8q:80/>9!8/H!8r+s+q+p+q*8>w#6!"8}28:8!8!8:8O*8 N~>*8!8:8O*8 ~0_*8C66+s#r!886+s#r#4¸>!8s+p+q:85*8>X6+s#rL*8*8M!h6\6+s#r!8p+q!86:8!86>~6HҊ!8n6+s#r#4X:8!8p+q*8N#FM28O>Ҫ>!"8>!8*8M!8d6+s#r*88͸6s#r:88͗6:8H9 :8**8#~A!86!*8#~D*8##~IH9!76!*8#~D*8##~AHc!86!86!*8#~Eu!76!*8#~F«*8##~F’!86è*8##~U¥!86è? !*8#~G:8*8##~028*8##~0o&<6*8 ~0_!8s:8/>!8/H*88? !*8#~M*!86!*8#~Ny*8 ~XI!76v*8 ~P^!86v*8 ~Ss!86v? !*8#~R*8##~OHҞ!76!*8#~R*8##~WH!76!*8#~S *8##~Y!76 *8##~I!86 *8##~O!86 ? !*8#~X!76!? 86 *8#~Lz8:8 t*8#*8M8͖n>8͟6e? 8q? w? 6 *8#~Up 8:8:7 Hҥ? :88͗6Hm *8#~A*8##~LH!"8d :8 :8Ha :8 *8#~0287 *8#~0o&<6*8##~0_!8s:8/>!8/H[ *88^ ? d ? 8å6 *8#~D*8##~R~IHH3 8:8ª ? :88͗6H0 *8#~A*8##~LH !"8B86+s#r' *8#~A/>P/H$ *8#~A_8' ? 8ê 6 ? !860u:8  . *8# *8&C68  -o  *8&C68  ~  *8&C68  ~ H  *8&C68  6  *8&C68  6*8~  *8&C68 6 *8~= *8&C68 Hq:8<282 0 d[108:7!7/M !76#6:7!7/a !76+6:7!7| :8y !86Ä !76+6:8·  *8&C68  6 *8&C68 6!86>8͟6 !86:8=!8  *8&C68 ~  *8&C68 :8w *8&C68 ^8:8<28 t !86:8=!8t  *8&C68 ~ *8&C68 :8Hj 0u:8<28# >8͟6Š K_8>0!7 :8/ 8͗6 To&"8>8͟6 !"8 state8, char = $ state7, char = $ state6, char = $ state5, nxtchar = $ state4, char = $ state3, char = $ state2, char = $ state1, char = $ startstate, char = $!8p+q!86*8&*8~ ~ HҞ !84y :8!8q:8[:8]H:8(H:8)H:8=H:8,H:8H >>!8p+q!86*8#DMn 28O>G*8~!8*8&*86 *8& *8"8>!8Ҷ:8=O*8 N͢ :8!8O*8 N͢ HҶ*8+"8*8~<:8!8=Oo:8!8O*8 DM*8 -*8&*8~"!86:8<28L:8=O*8 ~ #:8=O*8 6!8p+q!86*8&*8~ʇ*8&*8~a/*8&*8>z/H}*8&*8~ *8&*8w:8<28/!8q:80/>9!8/H!8q:8A/>Z!8/H:8<28O*8 ~28*8& *8~28!8q*8 ͭ6:8<28O*8 :8w!8q!86*8M͠/:8$H*:8*8M͠*8M͈H:8_H:8$H:8!8/Hy*8M͸:8<28**8M͠*8M͈H:8_H:8$HҴ͸:8<28y*8 6*8 :8w:8!8q*8M͠*8M͈H:8*H:8?H:8_H:8$H!8q:8!8w*8M!8:8HҲ:8*¥:828*8&"8͸*8Me:8<28͸M!8:8z*8!8s>!86!8:8+ښ?:8<28*8!8sì*8M͸>!86> !8*8&*86 :8<28º:8::8A/>P!8/H :8A*8M͠:8$H:8_H:8*H:8?H/^*8~^>/k>:8.“͸*8Mғ!86/ғ>*8 6 *8 6@>!8q*8M͈/ҹ>*8M͈*8 :8/H:8H*8M͸*8 ~<*8 wù:8H:8DH:8BHM*8 ~!8J*8M͸*8 ~<*8 wM>*8 6 >!8q:8\h>͸:8\:8H*8 ~ Hҭ*8M͸*8 ~<*8 wk:8\:8H͸í:8\>*8 6͸>:828͵>:8=28͸!86 * Y/* ͦ/*>>:8,:8)H:8H]*8 6>v*8 >*8 w>> O>Ұ*8 >*8 w*8 > ҭ*8 6 >>:8,:8)H:8H*8 6>*8 >*8 w>>:8*8q#p>*8 6*8##q#p>:8?  *8M0:8K:8]‘͸:8,:8(H:8)H~͛:8Š/ð:8 :8,HҰ͸CC:8  *8M0:8:8 :8,H͸ :8)͸)>:8   *8M0:8<*8 q#p *8 6>-28Jʹ>:8c  *8M0:8(r͸ :8Ҏ*8Mq#p *8 6>-28Ҝ)>;:8Ҷ  *8M0:83:8!9w͸!9~,~ HC3!9~]0:8(:8,H:8)H͛3:8+3/3!9~=?M3>3:8Y"  *8M0:8u*8Cq#p *8 6>*8 :8wO>Ҋ>y28Ҙ͟>:8ұ4  *8M0:8):8H:8͸:8=28ñ:8[͸C:8 :8,H:8(H+:8($:8<28͸//:8EF  *8M0:8a *8 6*8/q#p>:8(v:8<28͸a*8 :8wO>ҋ>ͳ28ҙ͛>:8@»!86͸X  *8M0:8:8)>:8(:8<28͸/:8[͸Cͳ28͛>!8p+q*8"8*8##^#V"8*8 ^#V"8!86!86͸!86 *8 6*8 6*8 ~^*8ͭ6t͜28*8/ͭ6Š/28*8Cͭ6 C28*8Mͭ6¶M28*8 ͭ6 28*8ͭ628!86:8/*8 6*8##ͭ6*8##:86*8##q#p!8p+q*8"8*8##N#F*8##N#F*8##q#p$*8q#p Scanning Directory... $Out of Memory $Not Enough Memory $ !8p+q*8͙͐28u! 9r+s+p+q+q! 96:9=! 9$* 9&* 9>* 9&* 9>H~?H>! 94>*8>29!8f:8A>!"9*99*896>~6f>>8͟6:9H:8HҘ*98!96:8=!9 *9&C68 ~:8H *9&C68  ~:7/ *8# *9&C68  :7/!94:7!96!96> !9J*9&*8>!9w!94(:8!9wwO!9 "9O!9 ^#V"8!96>8͟6:9/H*8*8> *8#*8#HҼ!96*8 "9*8 ^#V"8t>8͟6>>*8~!ʡ/ҡ*8#DM!"99͢6>89͒6>*9"9"8*8#"8. *8#*8# -B*8>*8w *8 >w#6*8 w#6*8 w#6*8 w*8 w#6*8 w#6*9*8s#r:9#*8> *8~!  *8 ;2*9 9͗6́6> 9͗6+s#r. *9*9DM -*8 *9s#r74*8>147>. *8#*8# -F *8 *8 ~*8 w!96!96K2>~6~!96!96>!9Ý:9!9w҃*9&*8n&"9:9*9& *8~9W6+s#r>9͟6:9<29Ï>!9ҍ *8 ;2<_*9&C6*8 >;2H͈6<0 *8 *9&*9&C66*8 >;2H͈6 *8 q#p*8 *9&*9&C66*8 q#pR08͗6"9!96>!9 *9&9) >w#6:9<29¥ *"9y2!86!"8"8!\6?\͢29!"9*9~!!!96 !!96:9ʈ!:9o&"8:9?!*9&<6a "9*8~|!*8#"8*8~ f! *8 ~28|!'|!/|!l0ͻͲ29 !!:"8;͗6Ҥ!|0u Sort Stack Overflow $Not Enough Memory for Sort $ Sorting Directory... $! 9p+q*9))))*9)) *9) *9 *8 !$9r+s+p+q!%96> !%9m"*%9&*!9>2&9*%9&*#9>2'9Hf"!'9:&9!%94-">!-9r+s+p+q!l96**9"49*,9"69:l9 u$*l9&))49 ^#V"*9  ^#V",9!l95,9*9͒6r$**9".9*,9"09*,9**9r6)*(9N#F!"909.9͒6#*.9)*(9N#F!"8*8DM*9"5#*.9#".9*.9)*(9N#F!"8 #*09)*(9N#F!"8*9DM*8"s#*09+"09*09)*(9N#F!"8G#09.9͒6#*.9)*(9^#V"29*09)*(9*.9)*(9N#Fq#p*09)*(9*29s#r*.9#".9>!09ͪ6#*09+"09"*909͒6.9,9͒6́62$,9.9͒6)$!l94n&))49 *.9s#r*l9&))  *,9s#r*09",9o$09*9͒6i$!l94n&))49 **9s#r*l9&))  *09s#r*.9"*9÷"Ë":l9ʆ$!0Ë$!96*9"(9>8͟6Ң$(99͒6r6!8ͭ6$!0!"m9*8+!m9ͭ6$*m9)*(9*m9s#r*m9"m9$!0*8+p"!96 Name Bytes Recs Attributes $------------ ------ ------ ------------$ Prot Update $ ------ -------------- --------------$ Access $ Create $ Press RETURN to Continue $Sys$Dir$RO$RW$Arcv $ $Read $Write $Delete$None $ $Directory For Drive $ User $: $k$ERROR: Illegal Format Value. $ERROR: Date and Time Stamping Inactive. $Total Bytes = $ Total Records = $ Files Found = $ Total 1k Blocks = $ Used/Max Dir Entries For Drive $No File $'2v9:v9 ''2v9':v9+'u:8W'*8+:w9͈6W'%0*9#"9 '!w960!w94*8 ^#Vx9<0*8 {9o0 *8 ^#V~9<0*8#DM10*8 N#F'[1k00*8 DM10 *8 ~'%0'%00 *8 ~'%0(%00:8+( *8 ~"(%0((%0Þ( *8 ~@(A0C(0*8#~U(10X(0*8##~k(20n(0*8 ~҃(30Æ(0*8 ~қ(40Þ(0*8 >ͪ6l)0*8 ^#V"9 >(%0 )*9 >@(%0 )*9 > )%0 )&00*9 ~*9 ~H=)*9 DMͣ5C) &000*9~*9#~Hl)*9DMͣ5:8|) 0Æ):9چ),'&0:8AO0:0:7 ڶ)1&0*8& [1,'!"9!96!9p+q*p9*9&6>~6'**9*86>~6!t9ͭ6H*,'m),'*,'*9#"9:8AO0**09&0*9DM1ͻ*p9#"p9*t9#"t9!9s+q+q:9ր!9j*>:9ր!9*>>!9p+q*9 N*7M*7J* *9 N*7M*7J*H!\6?!96\͢29:95+:9o&"8> *8 ~H;2ᖟ/H,+',+*8#DM͂*,+*8#DM)Ͳ29*!96:9Ҭ+*9#"9*9)*(9N#F!"8*8:889͒6HҖ+*9#"9*9)*(9N#F!"8[+89͒6©+*9"8+*8"8*8:898͒6H+*8"8ö+:8+!96+!9698͒6i,*8 >ͪ6!7>͟6!7H*8#DM͂*Hc,_'*8#DM)*8 N#F'[1<&06++!96!"t998͒6q-*8 >ͪ6!7>͟6!7H*8#DM͂*Hk-*p9*9&6>~6X-*9*86>~6K-:8>t9͟6H>-,'m),' %00 %0,'3%003%0,'*9"9*t9#"t9H-,'*9#"9U-,'*9#"9[-0͎'*p9#"p9_'ͻ6+u,!96!"t998͒6d.*8 >ͪ6!7>͟6!7H*8#DM͂*H^.*9*86>~6A.:8>t9͟6HA.,'m),' %0[%0:8@.%0.%0,'3%0r%0,'*9"9*t9#"t9,'*9#"9͎'͟(*p9#"p9ͻ_'6+}-!"9"p9"x9}2z9o&"{92}9o&"~9298͗6"8*9 "9!"96+>!8ҵ.>&0u*8M!D/ ^#V͵*J/+J/:8&/:8:8@:8 H:8HH!9/r-#/]&0uA/:8!9>/r-A/j,J/...:8>!p9ͪ6H0*98͢6!8҆/ 0 0Ì/,','&0x91k0&0 {91&0*p9[1&0~91&0:8AO0:00*8[1/0K2#[1>p9͟6,0:8&0,'m)&0ͻ;0!o96:8;0,'!9r+s+p+q*9^#V"9*995s#r!9ͭ6n0*9##4!9r+s+p+q*9^#V*9DM<0*9##*9##~`iw!9p+q*9##~29*9##~w*9n6+s#r*9#:9w!9q*9&!9p+q*9  0 0  0!9p+q!96>!9/1*9&*9>O0!941 0!96> !9Z1*9&*9>O0!9491!9s+p+q+p+q>9͟61*9*96!9s*96"9PY! 6"9>~6!9#~Hһ101!96:90O0j1!9r+s+p+q*9##~2*9##N*9DM[1*9N#F'[1:2!969:9͟6+20*9&<6!9s 2*9N#F'[1!9q*9&*9~!9q*9&*9*9& *9N`ih6n&"9;2<o&"9;Zx0NSun$Mon$Tue$Wed$Thu$Fri$Sat$!9q:9<29O*9 :9w!9p+q*9~$3*9:9<29O*9 w*9#"92!9q:90O2!9q:9O3:9O3!9q*9M3:2!9q*9&! 6K3*9&! 6M3!9q*9MJ3/2!9s+q:929:9*9&2) >;͟6HҸ3:9=:9*9! 6!9s*96"9:9!9q*9&! 6))))*9&6 }!9s+q:9!9!96N!m"9:9*4!n"999͒67499͒6+s#r!944!96 >!9Ҋ4:9=29l4!96*9&2) :96!9ͭ6҇4R4*9 ~29*9 ~29*9 ~29*9#^#V"9+!6!9s4!96:9>;!9ͪ6H4!96M4*9&2) :969͢6!9s+4*9~(5:9O!2 DM2 2*9Mo3*9Mo3*9MJ3 2*9M93*9M93*9~`5*9M3!9p+q!"9*9"9 "9*9~~Hҟ5͋4!96 5â5u!9p+q!96.*9DM9 -º59a5!96> !95*9& 9 N0:9<295i`N#Fog_og_ogDM!>))덑o|g26 = 6^#V))) DM!>))R6 =J6_og^#V) h6^#V|g}o r6_{ozgO{ozgi`N#Fogo&og_{_z#Wi`N#Fog\DUMP VERSION 3.0 DUMP.COM COPYRIGHT 1982, DIGITAL RESEARCH151282654321Ҋ ҏ>.Ï_ Ҧ0Ï7Ï͜Ü\2|::Iͺ>2 :2f>2>û>!6 #=!~a1{1 w##:Ƃ2*6 2fl:<2!G\:>2 *|ͫ}*ͫ>:Ï:> ͏> Ï> Ï:_:<2>2ͺ >Ï*}o|*!""ͮͷ͇*"͛~ͫ#*}#"%"*̀*}K|K*ͺ-m121=2#\:}mͺ2>o:  /\ͺ 1gn~ͻ͙D.:ܰg+":>2 CP/M 3 DUMP - Version 3.0$ ERROR: File Not Found $ Enter Password: $ Password Error$ ERROR: No Records Exist$ Press RETURN to continue $, 1I"CP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH1512826543218/82Invalid Filename$DIRECTORY FULL$DISK FULL$Creating Password$File not found$File not available$  ,.;=:<>_[]*? ERROR - $Password ? $Cannot Edit Wildcard Filename$Enter Output file: $FILE IS READ/ONLY$NEW FILE$-(Y/N)?$Insufficient memory$Enter Input file: $Output File Exists, Erase It$ BREAK "$" AT $END OF LINE$1I"1I"̈́""%*"%}0!#6%!"I" ͫ!+!#s͠!#s#r!I"!^ ͵ #I"!++s#r!#ͧ!+s#r!"#*#ͺ!"L#*I"% 6*I"+"K"ͫ!"M":] sr ͡ !#6\Mڀs:#Ҷ\S:h2y#!h6*"%|¶12!%¶!!%6!#6!+#:\:t#/H+#͍͋!%6 !"%*K""%!#6à1I"! %6#@1I"! %6?@1I"! %6>@1I"! %6F!"$%@! %6F!"$%1I"!w#6 * %M͟  :% :% H| Ã*%M͟ >$%!ʝ*$%DM !"$% 1I"!{#6! %6!z#6͂ ! %6E: $2%E͑  sð H͑  !s#6#~:+#2%:\2+#:%2\#+#3\+#!t#6ð :%I`!#: $: %H2z#i!#6!"%}2%*%+% ~ fiW?:%<:%:%H:%H:%­ ͋:% :#!# :%^> :#2#O> w:#!#?!w#6!#6!w#6:#2#!#&:#2#:#2#:#!#< ,V*%+% ~ P !%6:%ƒ> *%% ~2%O͟ !%6:% *%+% ~ HҬ ͟ - *%Mo ^w:%@Ow:% :z#/H- : % :% !#4 :% :#O>!#w-:% :% /!%6  w4!%6!#6pi:%O- !#6:~#!z#] ð O͸ u\Kð :%RRP"m2 %Ғ!v#6:v#: %ڬ P"r"!\"6!p"6#6P"!v#6Y2%-!v#6P"Kð Q͸ +#ͺ:t#/!s# #+#3+#ͺsð :%-&͂ !%6:%#7ͻ͂ t!T!:%:Q!%6L=!t:%:t͂ !=!:%t*%#"%Ҁ!%6:%B¡!%>w!"%*K""%ͅð :%C²Ͳͅð :%DͲ͋ð :%K͋ð :%L͑ð :%P !%6w  ͎ð :%T ð :%U6 :%2}#ð :%V… f %%!DMt/͟ *K"DMt  :%2~#} !#6 !#6ð :% ± :%: %HҮ ͑ð :%Hҭ :%A !%6*%"%*K""%ͅ   !%6ͅê :%F M \ ê :%J¤ Mx: %2 %xҡ \: %=2%:%<2%! %f *%&$ ~2%-E *%"%* %M* %~ ! %: %%!"%!%6ͅ*%DM͘4 ê :%M: %H !%6>%! L:%<2%O!%$ Hqy :%2 %!%6*%#s#rê :%Nf Mc * %` ͭ/ @̀ !%6!"%͇ͅ!%6K"%!]   ê :%S¶ Mxҳ \: %2%%!DM͘! %:%Ұ *%&$ ~2%!%4-Ï t ê :%W ê :%Xu P"m2 %!#6 !u#6P"^:#  r `!u# ͓B !u#6 r"P"!"6#6!~"6!"6r":#B 5*%"%%%!o *%% N*%"%K >ê :%ZŸ ҏ ;  @Ҝ Ï ê :%ʪ ð ív!&%q:w# *&%&!'%q:'% !#4:'%  !#6*'%M :#    !#55!(%q:(% :#O>H2)%yQ !(%6 !*%6:)%!*%n *(%M !*%4V !+%q:+% ~ >:+% :+% H:+% H!,%q*,%Mo ڻ ^+ :,%@2,%*,%M+  ͟  ͟ !.%p+q*-% !0%p+q */%DM !2%p+q *1%DM !4%p+q*3% !6%p+q*5%:! %6O!"$%@!8%p+q*7%!:%p+q*9%2#!<%p+q*;%2#!>%p+q*=%!@%p+q*?%!B%p+q*A%!#6# >>!D%p+q*C%!F%p+q*E%!K%r+s+p+q+q:G%=2G%+*H%*J% w*H%#"H%*J%#"J%!M%p+q###*L%gR !O%p+q*N%f!P%q*P%&-:u#Ҁ#^͵  !R%p+q*Q%DM s+#K͍:#ҹ#!T%p+qͬ*S%DM^!V%p+q*U%DMͺͬ*U%DM͑!X%p+q*W%DMͺͬ*W%2#!\%s+q+p+q:\%=2\%2*Y%:[%w*Y%#"Y%!`%r+s+p+q *]%*_%DM"͹!a%6:#!a%ڵ*N#*#DM\q2#ʤ>!#ґ͟*N#*#6:#2a%î*N#"N#!a%4`͹!"N#:s#>#N#!X*N#*#~2b%*N##"N#:b%:t#):s# )!R#+##R#3R#ͺ:#)>>!P#ͧ!!d%s{@*P#!e%s!"P#!c%6:d%!c%*P#*L#DM+#́ʵ]>P#!ʦ*P#:e%ͷ!*P#*L#DM*L#*P#:e%ͷ!"P#$*P#"P#!c%4S!"P#!f%q#P#!,*P#*L#:f%w*P##"P#!g%q:#,Q:~"2":"2"r"́'$$!#6*#&" :g%w!#4:#2h%>!h%Y!h%4Dr"K!i%6 :i%=2i%ʐ*i%&r" *i%&P" ʍ>e>:"2~"r":"2"Qr"q:"2"!#6>!#*#&" ~!#4¾*P#},:s#\K+#K:#͟:x#+:5#25#ͬ+#:t#G\]#l3\+#]#;#3+#!k%p+q*j%*j%DM!l%q: %ʄ*l%M͟ !m%q:m%a/>z!m%/H!n%q*n%M͌ҹ:n%_:n%  # !o%6>!o%I Oͤ2p% *o%&# :p%w:p% I:p%:p%7:o%$:o%=2o%O!# 6 :p%Bs!o%4ͭ2p%!q%q:q%a!q%6:|#p*q%Mͤ:q%!s%p+q!'"v%!u%6>v%!*r%*v%~!{2t%*r%̀!"r%PY! ~!"v%:t%!u%!u%6:t%0O͟  ͟ Å!y%p+q:~#*x%DMt:͟  ͟ :z# ͟ *͟ *!$DM: %&*%& ~I:%<2%O! ~> >! %ҡͭ_! %:%ڍ>%!ʈ*%+"%>ͷ!ˆ!%6:%<2%=O!%$ NP:z#Ұ; OP:{#!{#6:#!~#K"%!*͟ ͡! $6 ͟ !#6!#: $2{#* $&# 6 : $<2 $=O!# NP:#B*Oͤ2%LLOͤ2%!{%p+q!~%6! %6!#6.:% ʏ:%ʏ *z%*z%#  :% ž.Ð͹y!|%6͹>!|%ҽÓ͡.ê:%::|%Ó*z%#~A<*z%wO>Ó*z%#6 .:%.)!|%6!#6.͹)> !|% Ó͡. :%;v*z% !|%6.͹d>!|%[Ó͡.H*z%DM#Þ>!}%҅Ó:~%ڏÓ:~% ! %6>:|%<2|%O*z% :%w!~%6!}%6>!}%*}%& :%> !}%  >!}%4¾>:#' ͡! $6!{#6 +#M9!t#6:,# 6,#]E+#\#4#:q"wRP"qr>!q"6:q"<2q"=O! NP!h6!j6!|6:#ҩcͬ\;"#:#c*#}|Hͽ ͬ\;"#*#}|H͍*#}2#:t#C:e&;͍C:fC:d>!#6C!x#6:#f:t#X͍!s#6M #+#3!7#6+#:#…͟:y#ʞ:y#27#ͬ+#,!7#6!K#6*#"N#!"P#!"!$!"%>%!!"%*%+"%>>!"#$:%*%#"%*%"%!"%+"%$*%"%*K""%!"%!%6:%Ҭ%%!2%*%v!"%% ~ He*%"%0*%+"%>ͷ!2%:%ڕ!%6%%!+s#ré*#$+"#$:%ҩ*%"%):%*%"%*%+"%*%#"%*%#"%*!$#"!$*!$+"!$*%#"%*%#"%*%+"%% ~ *%+"%!%q:%Y%%!V:%S*%% ~2% E*%% :%wÄ%%!҄:%ҁ*%% *% wYͅ!%p+q%%!ʱÞ:%*%"%%%!!"%%%!"%*%"%%I"!%!*K""%*%*%"%%%! OQ2%3*%% :%w:% M!%q:}#d*%MP:%K"%!x*%% ~2%O:% –hͻ%K"!M"!ڼÿhÝ!%6!"%*%"%͚ͅh%%!!%6ͻ:s#)2%)*%M%%!=*%% :%w:% VL2%:% :z#/HH/Wҥ:% ”!%6 ͦ!%6 :%Ÿͦx* %&$ :%w: %<2 %d!%s+q*%"%!%6:%/%K"!H8*%#"%"%:%2%*%&$ *%% !%:%2%/H5!%4*%#"%:%I*%+"%ͅ:%! %6x: %2 %* %l!%p+q*%DMM2%: %ڍ! %6O@ *% ~ :#/Hҷ *%#*%#~ *%##:%*#$*!$DM!z#6:%!"#$*%"%*%"%*%+% ~2% %:#" ,*#$#"#$*%"%%%!v:% Z*#$#"#$ͭZ*%% ~2%O͟ *%"%2*!%&"%*%"%*%"%̀w͑:%2%!%6w:%2%K"%!>%!H͇!%6>!%ͭ@>!!%4!%6!"%ͻ, M"%!& )  !%6 -!%6 -:#>%!H] @!|#6*%M͌2%*%MP2%:%/!}#+w!|#6L2%^ !%q!%:%:#H: %H!%q*%M͑  *%M V ; Oͤ2% :%N à:%Y > >:%02O"O> /!"%!))덑o|gҗ! =…!^#V) ¡!^#V|g}o «!_{ozgi`N#Fogo&og H !=! LIBX$$$$$$$LIBX$$$$$$$LIB$$$BAK 1CP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321PASSWORD0CONFIRM []=,  *** Aborted by ^C ***$ Disk I/O $ Drive $Read Only$Currently Opened$Password Error$Password: $ $Not erased, $ ERROR: Missing Delimiter or$ Unrecognized Option $Near: $Requires CP/M 3.0 $Enter filename: $ $ERROR: Invalid file name $Confirm delete all user files (Y/N)?$No File $ (Y/N)? $ *** Aborted by ^C ***$11͢}0͢|HSb4 ڑ!16fb(r2:<<2}wb!6 *}& 6!u6:}!uڑ*u& ~aڊ*u& ~}Ҋ*u& ~ w!u4U!"+!\"-+5 "{{͔zb>{͜*{~ *{#"{*{#"HR :\Oy<2\2y.3l -:1/Ҁ!u6:u<2uO!\ ~??(> !uҀ:2/Ҁb@2x:xy:xYH/} .l\ -ˆͫlͻ2z:zµb:z6:z`O! "/E";G"=I"?"A"C"E:1Ҷ*/:y³:\A=OI:I I!v6> !vW:v ?.I*v&*/NI:v<2v)b@2x I I:xƒb:xy:xYHҳ. */#DM] -¨ . */#DM] -  ͫ*;E*=G*?I*A*C*E!=lͪ-.*=l -%2zõv!q*&!p+q* !s+p+q*:w#6* *#"N#Fy  !p+q*! p+q*!"p+q*! -!'q:'2#!$6#1!*r+s+q:(2#!$6*)#s#r#1m!Nq!O6*O& X>*O& :Nl:O!O4F!Ur+s+p+q+p+qͪ !\6*T~*T~2\*YM=2L!`6:L :`*YM=2LïÐ:V2KN :V2K2_*T~2]!`6*T~2\*T~j*TN! *R*R =2^!_^!`6!W6:_!W[ :`T!W4=a*T6N *T:]w:KH͂+s#rͪ :Lʔ*H#"HÙ!L6:\2aO*R ~2X*X&*P:!a4*T:aw*X&*P:Y*a&*R~2Xë*T6*H~2Y͚:X2Z!V6*H#~2Y!Z4N*P :M( !`6> *Z&*P:Y> !`6!V4N*H ~2Y*V&*H~2Y*YM=2L:L>!LHҗ !V4N*H ~2Y*YM=2Lf :V2KH͂#+s#r*HN=2L! *H#"Hê ͙ b I I!es+q+p+q:e=2e *b:dw*b#"b !fq I:f) b:f7 b:f:fHU b:fc b:fq b:fҁ !hp+q:2Қ *g >w3ͫ*g:\w*gDM"i*g >w*i} *i|2k:kH *kM :k>Y2la :l{ :l :lb3 !m6>!mڗ 2n D *m&3 :nw:n O × :nZ  :n€ :mm  :m=2mO!3 6 , :n !m4# ͙2n!oq:1 :\A=OI:I I!v6> !v :v .I*v&*/NI!v4 bb*oM \͂ 2wQ :w$ *wM B :wB *wM͞ \͂ 2w:wQ *wM͞ !L6!J6:L:LH:LH Jt:J b.bLb:KH͜+"p!r6:K!r *pNI*p#"p!r4¹ :J !26:J !16\ !tp+q*s~ ~ H% *s#"s *s~1 >>!`i^#V#~#for0V y wÇ G:„ xA  a{k_  ~ ~r_ogi`N#Fogo&og_{_z#W0 1n$'CP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321!`i^#V#~#foͽ{¡y#wG:xA##6?)@w){#{s333333.;;33,;;#wD{_#6 sO O ڹ.:;=,/[]<>a{Ҷ_#  ý Copyright (c) 1982, Digital Research 11/02/82 @ @NULL0LOADER0SCB []=, :;<>%\|"()/#!@&+-*? COMHEXRSX1###~ERROR: FILE: File not found.No directory space.Invalid file name.First submitted file must be a COM file.Duplicate input RSX...Duplicate RSX in header. Replacing old by new.Invalid RSX type.No more RSX files to be used.Error on copy.There are not enough available RSX slots.Disk read.Disk write.Total file size exceeds 64K.COM file found and NULL option.No header or RSXs to strip.Invalid FCB.Media change occurred.Disk I/O error.Invalid drive error.Invalid SCB offsetMissing right parenthesis.Missing SCB value.Missing left parenthesis.Unrecognized option.No modifier for this option.OPTION: This file was not used.GENCOM completed.Requires CP/M 3 or higher.1n$1n$" %* %|<Ó* %}0HÓ::$]Ç:$jZÇ:$wÇ:$҄ZÇer ͺv!n$q*n$& ͤ!p$p+q*o$~*o$Nͤ*o$#"o$  ͤ ͤ!r$p+q*q$DMͺ !t$p+q*s$!v$p+q*u$!x$p+q*w$!}$p+q*|$"y$*y$}2$|2{$!~$q*~$&,2$!$p+q*$!$p+q*$!$p+q*$!$p+q*$!$p+q*$!$q*$&-!;6:$!; *;&') N#F:2$!;4%:2$%ͻ2$!;6>!;S*;&/% 6!;48!/%6 !;6#6:; *;&*(~ HҞ*;&*(*;&/% w!;4#4`*;&/% 6.!;6 :; *;&*(~ H!;4#N*( *;&/% w!;4î!;p+q3r*;DMͺz/%ͺ!;p+q*;DM *y$}2;|2;:; F  :; T   :;x :;j $ :;x 4 !;q!;6*;&1 :/• >*;&1 :;© :;!;4 !;r+s+p+q+p+q !;6. *;~ *;~2;*;My 2$!;6:$ L :;  *;My 2$ ! . :;2$͌ :;2$2;*;~2;!;6*;~2;. *;~L ç *;N! *;*; =2;!;› !;6!;6:;!;ژ L :;ڑ 6 !;4z Þ 6 *;6͌ *;:;w:$$͂#+s#r :$ *$#"$ :L2$:;2;O*; ~2;*;&*;:/( !;4*;:;w*;&*;:; *;&*;~2; *;6*$~2; :;2;!;6*$#~2;!;4N*; :0f !;6| *;&*;:;| !;6!;4N*$ ~2;*;&*$~2;*;My 2$:$:$H:$H:$H !;4N*$ ~2;*;My 2$ä :;2$$͂##+s#r*$Ny 2$!L *$#"$ :$$#+";!;6:$!;P *;Nͤ*;#";!;41 !;p+qr*;DMͺ!;r+s+p+q*;DM͗ *;DM͗ *;~w*;*;~!;p+q*;>9Ұ *;~7w÷ *;~0w!;r+s+q+q*;:;~!;H IQ !;60!$6!;6*$#"$;+ͱ :;" rͺ :;2 !%6? :;? !%6:$H :$Q :$ˆ :;} rͺ;+ͱ È aͧ !%6:$‘ :$š :$£ *$#";*;Ny 2$ *$DM*;i *:&: w*$##"$ *$;i *:&: w*;"$!:4*$Ny 2$\Q *$#"$*$Ny 2$:$1*$#"$*$Ny 2$!L:$IY!M:$YwQ *$#"$*$Ny 2$!N*$#"$9*$0͸ *$#";*;Ny 2$!L:$£!M:$°6*$0͸ F*;0͸ *$DM*;i *:&v: w*$##"$2*$;i *:&v: w*;#"$Q !;p+q*;DM*O>0*;"( !;p+q*;DM:O>R*;"( !;p+q*;DMJ2$>!$y*;"( *( >Š*(DMͻO>ҟ*("(!;p+q*$"%*;"%*$"'%̀"$$#*'"( !;q!;6>!;*;&)))=% *;& *;& w!;4!;6 >!;F:;2;*;&; 6*;& 6!;4!;6> !;ڍ:;2;*;&% *;&; w*;&*(*;& w!;4K;ͫ2$>!$ҥ*'"(!;p+q!;6 >!!;*;&*;6!;4±!̓#+s#r!<5&*<$T :{$]*(DMZ!#:Q! <#:Q2<* !<ړ*<&* (6!<4w* (" (!<6*<&') ^#V"(x*(DM͋2$!)"<*<*<&$) N#Fq#px*(DM͋2$:)!)6*<&9 :)w!)6!)6!)6%͛2$!"$$*$*$"$!<4:$GT*<$#ã!!<ڸ*<&: 6!<4!\"<$w#s#r!n"<$w#s#r.:[ -!<6>!:H!<6::=!!!%(z:$/H!"$$#͞%U!$6̓!"<6:"<#ڀ*"<&( 6:"<<2"<_!"<6:$!"<ک*"<&$) >w#6:"<<2"<…!(" (* (:Ow:%/* ( :Ow* ( 6* ( :$w!"$:%:O2)x* (DM%͛2$>!$!%"( ):%/i:$R%͛2$*("(!"$$fx%͛2$!"$o!"$*$*$"$/!##"$*$DM*#w#6!)" (%͛2$* (##"*<**!(<ڋ*&<&)))9 *(<& *'<&)))9 *(<& w:(<<2(!(!%< *%<& * (*$<&)))9 *%<& w:%<<2%<!)" (!$6!,<6:$!,<*,<&$ 6!-<6:$!-<ں*-<&') ^#V"(!.<6>!.<ڑ*.<& * (*.<& *(ʇð:.<<2.!$:$_!)" (!,<6:$!,<r:,<<2,<* (#^#V"0<:$5~ *( 6x*(DM͋2$!0<#"$%͛2$*$DMi*0<"$/>>!)" (* ( ~2$ʃ҃* ( :$* ( w*("(* ( >Ҭf %͛2$:$~!"$$!"$$#*$"$*(DM1͞%U̓!)" (*("(!"$:%N:%/!$N!)6 *( 6*(DM͛2$:$H !"$:%1:$d~õ:$ʚ x*(DMZ:$ʚ:{$$͂#+s#r*(DMZy:{$$͂#+s#r!$#+s#r*(DMU:$/1*(DM1x*(DMͦ*(DM*(DM͋2$.)$ -:% !)6:O2) *( 6*(DM͛2$:$1 *(DM1!"$!3<6>$#_"*(DM͠*$~[h*( ~25<>!5<!6<6!4<6:5<=!4<*6<&*(*3<&)))=% *4<& w:6<<26<:4<<24<†*3<&% :5!%**(DM*O>S:%/P o:%o*( >o :% :$<2$23<!*3<&ͮ#% *3<&') q#p!4<6:$=!4< !5<6> !5<:3<=o&!ͮ#% *5<& !*3<&ͮ#% *5<& w:5<<25<³:3<=23<:4<<24<£R"*'"(X">!$҉!!$6!3<6:$!3< !*3<&') ^#V"(X#/b 'Ͳ"!*3<&% >x *3!$Ҙ Ͳ"!:3<<24<:$!4<!*4<&') ^#V"'!6<6>!6< *6<&*(*6<&*' :6<<26<¿ Ͳ":4<<24<Ÿ :3<<23<0 !$:$ !9!3<6!$:3<҄!*3<&$ ~24<:$=2$:4<26<:$!6!$ҹ! !O:) ":$!!$6!:%!%!!$6!!$6:)"!$6.;) -!2":$"!$62":%!%,"!$62" :"!$6:$/^"%ͦ%ͻ2$*(~2%%S!*3<&ͮ#% "(*3<&') q#p!4<6> !4<ڱ"!*3<&ͮ#% *4<& 6:4<<24<…" *$&$ :3 !6<#*5<&*7<*6<&*( w:5<<25<:6<<26<"!: !6:5<<25<:6<<26<:#>i`N#Fog_ogDM!>))덑o|gҨ# =–#DM!>))ҽ# =µ#^#V) #^#V|g}o #O{ozgi`N#Fogo&og_{_z#WTEMP $$$  1TdCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH1512826543210123456789ABCDEF ERROR: $Reading file: $Writing file: $Directory full$Reading file: $Writing file: $Invalid drive.$) ? $) ? $) ? $Bad character, re-enter $ $ Disk read error: $File cannot fit into GENCPM buffer: $Unable to open: $BDOS3 BIOS3 Setting up directory hash tables: $ Enable hashing for drive $: $Unable to allocate space for hash table.$ Setting up Allocation vector for drive $ Setting up Checksum vector for drive $ *** Bank 1 and Common are not included *** *** in the memory segment table. *** $Number of memory segments $ CP/M 3 Base,size,bank ($) $ Enter memory segment table: $ Base,size,bank $Zero length segment not allowed.$Bank one not allowed.$ ERROR: Memory conflict - segment trimmed. $Memory conflict - cannot trim segment.$ ERROR: Memory conflict - segment trimmed. $ ERROR: Memory conflict - segment trimmed. $ CP/M 3 Sys $ Memseg No. $ Bank $ Accept new memory segment table entries $Default entries are shown in (parens). Default base is Hex, precede entry with # for decimal $ Use GENCPM.DAT for defaults $Create a new GENCPM.DAT file $Display Load Map at Cold Boot $Number of console columns $Number of lines in console page $Backspace echoes erased character $Rubout echoes erased character $Initial default drive ($:) ? $Top page of memory $Bank switched memory $Common memory base page $Long error messages $Double allocation vectors $Accept new system definition $ CP/M 3.0 System Generation Copyright (C) 1982, Digital Research $ BNKBIOS3 SPR$BIOS3 SPR$BNKBIOS3 SPR$BDOS3 SPR$RESBDOS3 SPR$BNKBDOS3 SPR$ 64K TPA Copyright (C) 1982, Digital Research *** CP/M 3.0 SYSTEM GENERATION DONE ***$!Tq:UM*T&!Tp+q:Ud*T !Tp+q*T#6:UҀ:Tڀ*T *T#N! *T6 7 7!Tr+s+q+q!U6N*TDMN:TTN͜:T.:T/!U!]6 !m6 !Tp+q *T 6 *T 6*T!Tp+q*T!Tp+q*T!Tp+q*T] ͧ!Tp+q*T} ͧ!Tp+q*T ͧ *T 6!Tp+q*T!Tp+q*T! ͧ!Tp+q*T" ͧ!Up+q*T$!Vr+s+p+q+q:V *V*VDM*V -- !Vs+p+q:VJ *V*VM!VLS!Vq:V e > :Va/>z!V/H҄ :V_2V:V!Vq:V/>!V/HҦ >ͧ>!Vp+q(7*V~ Y7 N7NTe:T *TMV Y*Vw!Vq:VO! N7:VO! N7!Vp+q 7*V|O *V}O H7!Vq*V&+SDM$ !Vp+q!V6!V60!'"V>V͇S† *VM7 !V6>!V VVzSڽ !V6:V<2VVVzS+s#rÔ :V *VM7!V60*V! S"V:V<2V‹ !Vs+q(7:V  #7*V&DMZ  *VM N!Vs+p+q+p+q :T: ͜*V6:V<2VO!T NV 2V  :V,u *V#"V*V6!V6 :V#… !V6  :V02V:V> !VHҽ >!VҸ :V2Vý !V6!V:V *V^*V&+S*V& *Vq !V6*V6ͧ *V6? ͜*VDMN*V~  (7*VN !V6>!Vn *V#"V:V:-Q/HX *V6d ,7*VN :V<2V, *V++"VNÊ *VN*V !V6!V6Te!Vr+s+q:-Q/Ү >!V6#q#p!V6:5Q!Vڳ*V&+SFQ  VzSک:VM*V&+SFQ  ~*V&+SFQ  VzSHJ:V2V*V&+SFQ  ^#V"Vé*V&+SFQ  ~*V&+SFQ  VzSHҩ:V2V*V&+SFQ  ^#V"V:V<2V¿ :V:VH`!V6:5Q!V`*V&+SFQ  VzS/*V&+SFQ  ~H*V&+SFQ  VzSHV:V2V*V&+SFQ  ^#V"V:V<2V:V!$V6!U6ͬ#Q$!H> U͇Sʔ* U|2Uß*U|2U!U:.Q2T*U|!UO:/Q2T*U|O:T2TUTI:-Q/!$V>O:T2T* U|O:T!$V2T:T=2T* U|O:T2TҮ:-Qқ*nV*U*V |!UO:/Q2T*U|O:T2T2Uͬ:U/Ҙ!!V6>!!Vژ*!V&$SQ  6:!V<2!Vsà!U6:V/ҫ*:U2T:T2TTͩ:-Q*T&+SDM*U*T&+SDM*U:-Q/ &:U2!V!""V*!VM"V͟:!V2U! U6Û*U|!U2!V* U|!Uo&)##""V*T&+SDM*!V*!VM"V͟:!V2 U:U2!V!""V>T͇S+s#r*!VM"V͟:!V2U* U|!$V2T:T2T U(T(TͩC*$V&+ST͊S+s#r* U|!$V2!V:-Q/ *T&+SDM*!V"*T&+SDM*!V*!VM"V͟:!V!Uw:-QҢ!T6:T2TULTLTͩ*U|2!V*U|!Uo&)*"V""V*T&+SDM*!V*!VM"V͟:!V! Uw:,Q/Ҳ:V2V *V&U  :T2T*T&! S!0*V& U q*T&! S0*V&!U q:V 2V*T&+S"!U$-U RUW !T6#6#6:.Q2U:/Q2UTqT TyT Uͧ pT !T6Uͧ pT pT :;Rһ!;R6:%V2.Q:4Q/24QTT TT L!U6N!Vr+s+p+q*V6 *V#6 *V|O! *V## w*V|O! *V w*V}O! *V w*V}O! *V w!T:TO`iPSW "V*V :0Qw*V :2Qw*V :1Qw.*V :3Qw*V :4QwX*V   :+Q/ҼW*V >*V w:@*V wW*V >*V w^*V :/Qw!)X"V*VN#F!W "V*V"V*V͕S(!$V6-!$V6*VSD*VWR!"&V!V6&VS!V6>!Vڷ*V&)*&V>͒Sʭ*V&)*&VWR"(V*(V ͕Sʭ!V6:V<2Vf:-Q/!V!$V6!$V6V>X W*V"V*V~>>!Vs+p+q+p+q%N*VDMN 7*VDM$  7*VME :,QҨ *V&U *VDM :V 2V*V&U DM*V:V2V*V&U *V&+S:V2V*V&U ) :V2V!Vp+q*V"TͣN,ͧ*VDM !Vr+s+p+q*V^#V"T*V##^#V"T*V ^#V"T*V#DMT  *VDMT *TZSU͊S@?ͧ*T+ZS}<2V!V6!V:V҆*V&+SW "TDMͧ *VDM> :V<2VS*TDMO W*T"T!Vr+s+q:VGTqT TyT *Vn}2T*V#~2TpT WTS}pS}TR+s#r*V&)+!Vs+6:V!V4>T͇S+s#rBKͧ pT^ :V<2VpT *VT :-Q/k)Tw T z!LT"V!U"V͙!T"V!U"V͙!(T"V! U"V͙*V#DMT  *VDMT *VDMeͧWͧ *VDM> *V*Ws#r*V##*Ws#r*V *Ws#r*VDM> !V6&VS(>!V6>!V*V&)*&V>͒S*V&)*&VWR"(V *(V## *(V ͕S*(V ͕SH*(V ͕SH*(V ͕SH*(V ͕SH!V6:V<2V-:V!V6!V6!V6>!V*V&)*&VWR"(V*V&)*&V>͒S*(V S?!V6*(V ͕S:V/c!V6N:VO!=R ~2T *(V WR"*V**V N#F`i))"VN:VAO7N*V&6Q DMʹ ͜*V&6Q ~/*(V q#p:-Q/!V6*V&,V) *Vs#r*V*LV"LV*V͛ 2V'ͧ*V&+SFQ  *(V w*V&+SFQ N`iPS*V&+SFQ  N`iPS*V&+SFQ  ͕S *(V q#p*V&+SFQ  VzS*V&+SFQ  q#p:V<2V:-Q/!V!$V6:T<<2T:T<<2T!V6>!V8*V&NV) >w#6*V&pV) >w#6:V<2V:!Vڡ*V&)*&V>͒Sʗ*V&)*&VWR"(V *(V WR"*V*(V ͕SN:VAO7:7!V6**V ^#V!S*V&+S*V&NV) q#p*V&NV) nVR+s#r*(V ͕S—'N:VAO7:7!V6**V >R!S*V&pV) s#r*V&) VR+s#r **V R*V&pV) CS **V q#p:V<2Vk:Vҫ͜:T2FQ!T:/Q2GQ!"IQ!HQ6!V6ON:GR2T 5Q N*FQM ,7*GQM ,7*HQM N:V/҈!N!V6:5Q!V !V6:V/ :V =O!=R ~2T*V&+SFQ DM *V&+SFQ  N`iPS*V&+SFQ  q#p*V&+SFQ  ~ͧ *V&+SFQ  ~7ͧ *V&+SFQ ~2V*V&*V&+SFQ  N "V*V|*V}O:/QH҆MN!V:/Q*V&+SFQ  Hq!V:/QO`iPS*V&+SFQ  q#p *V}2V!V6!V6!V:V# *V&+SFQ ~2V*V&+SFQ  :V2V*V&+SFQ  *V&+SFQ  !V:V/+~!V/H+ |ͧ!V6 :V!V+~!VHc N*V&+SFQ :Vw!V6 :V!V+~!VH N!V:V*V&+SFQ  Hq!V:VO`iPS*V&+SFQ  q#p!V6:V<2V×1:V<2V"͜!V6:5Q!Vo!:V!N!N:V=O *V&+SFQ NE *V&+SFQ  NE :-Qb!N*V&+SFQ  N ͜:V<2V !T6!V6%NVʹ ͜PNT2V!TT TT N!V6Vʹ ͜:V!FT !!U6+6!W6͌!:W/җ#:R2T͜N;Rʹ :=R2T͜͜N,Qʹ ͜͜:>R2T:2Q<22Q  2Q :2Q=22Q:?R2T:1Q<21Q' 1Q :1Q=21Q:@R2THN3Qʹ ͜:AR2TkN4Qʹ ͜͜:BR2TN:0QAO7NTe:T"*TMV A2W*WM͈ /"Þ":W20Q͜͜:CR2T.Q *.Q&PS"U:DR2TN-Qʹ ͜:-Q/2T:-Q[#:ER2T/Q ͜:FR2TN+Qʹ ͜x#:R2T͜N!W#*W&U 6:W<2W#!W6>!W $*W&U 6$:W<2W#!V6*V&U  !V6TqT TyT Wͧ pT^ pT^ WS#ZS"U!W6>!Wڋ$*W&,V) >w#6:W<2Wh$!"LV:]A$!U6#6!W6>!W$*W&=R 6:W<2W¦$$!U6#6:mD$!U6!T6 Available space in 256  byte pages: $TPA =$, Bank 0 =$, Other banks =$Unable to allocate Dir deblocking buffer space.$Unable to allocate Data deblocking buffer space.$Unable to allocate Data deblocking buffer space.$Drive specified has not been defined. $0FFFFH is an invalid value in the DPH directory BCB address field.$ Setting up Blocking/Deblocking buffers: $ The physical record size is$: $ *** Directory buffer required *** *** and allocated for drive $: *** $ Overlay Directory buffer for drive $: $ Number of directory buffers for drive $: $Minumum number of buffers is 1. $ Number of directory buffers for drive $: $ *** Maximum number of directory buffers *** *** for the current drive is$. *** *** Number of directory buffers reduced *** *** accordingly. *** $ Share buffer(s) with which drive ($:) ? $ *** Data buffer required and *** *** allocated for drive $: *** $ Overlay Data buffer for drive $: $ Number of data buffers for drive $: $Minumum number of buffers is 1. $ Number of data buffers for drive $: $ Share buffer(s) with which drive ($:) ? $ Allocate buffers outside of Common $ Accept new buffer definitions $!W6>!W**W&)*&V>͒S**W&)*&VWR"(V ͕S*(V ͕SHҸ* *(V WR"*V**V ^6 *W&$SQ q#p*W&$SQ  6*(V ͕S*%ͧ!W4*!W6>!W+!"HW}2W>!W=+*W&$SQ HW|S ~H6+*W&$SQ ^#V"HW!W4**W&))lW *HWs#r*W&))  >w#6!W6>!W+*W&$SQ HW|S>͇SH+*W&))lW  *W6 DS+s#r*W&$SQ  6!W4h+!W4*!W6>!W7,*W&+SFQ  *W&W) N#Fq#p*W&+SFQ  *W&7W w!W4+:-QF,!fW6K,!fW6 !W6:W4:fW=2iW!"gW"dW}2 W! W6*T&PS*LViS"bW:-Qڞ,nVbWzS*ViS"bW!W6>!W,*W&W) *W&+SKQ  N#Fq#p*W&$SQ  6!W4£,!W6! W6#6!W6n&))lW  ^#V"JW*W&))lW >͒S:WH3:WE-1&N!W6]&N*W&))lW N#F$ {&N!W6>JWR>fS:WHҚ-!JWVS+s#r!W4g-!JWVS+s#r:W3*W&)*&VWR"(V WR"*V >RZS"^W **V ͕S-!W6-!W6*(V ͕Sc0bB*W&$SQ  >w:-Q.: Wd.! W6*W&$SQ  6&N:WAO7&N.:W{O!=R ~2T&N:WAO7'N*W&$SQ  DMʹ ͜*W&$SQ  ~.*W&$SQ  6.*W&$SQ  6t/:W;O!=R ~2T'N:WAO7>'*W&$SQ  DM  : Wt/! W6*W&$SQ  ~t/A'ͧb'N:WAO7'*W&$SQ  DM  &/*W&$SQ  ~^W͇Sҹ/'N*^WDM$ 'N*W&$SQ  *^Ws*W&$SQ  ~R0:W[O!=R ~2TM(N*W&$SQ  ~AO7(NTe:TL0*TMV A2 W* WM͈ *0/* WMF80/*W&$SQ  : Ww͜c0*WMTCc0 4*(V ͕Sn3!W6*W&$SQ >͒S°0*(V q#p*W&$SQ  6n3bB*W&$SQ  >w:-Qګ1: W1:W1! W6!W6*W&$SQ  6(N:WAO7(N1: W1!W6! W6:Wʨ1:WƋO!=R ~2T(N:WAO7)N*W&$SQ  DMʹ ͜*W&$SQ  ~ґ1*W&$SQ  6è1*W&$SQ  6! W6S2:WKO!=R ~2T)N:WAO76)*W&$SQ  DM  *W&$SQ  >w: WS2! W6*W&$SQ  ~S29)ͧZ)N:WAO7)*W&$SQ  DM  2*W&$SQ  ~$3: WҌ2! W6*W&$SQ  :Ww 3:WkO!=R ~2T)N*W&$SQ  ~AO7)NTe:T 3*TMV A2 W* WM͈ 2Ü2* WMF2Ü2*W&$SQ  : Ww͜*W&$SQ  :Wwn3:U!W]3:W+O!=R ~2T)N*W&$SQ  DMʹ ͜*WMTCn3 4! W6*W6 dWDS+s#r!W4>JWR>fS:WHҿ3!JWVS+s#r!W4Ì3!JWVS+s#rç-!W4n&))lW  ^#V"JW-!T6!W6:W 4bB)NWʹ ͜P,!"PW}2Wo&"TW2W>!Wu5*W&$SQ  ~n5*W&$SQ  ~ >Hһ4:-Q|4!W4á4*W&$SQ !^N#F-S*TW"TW*W&$SQ  ^*PW"PW*W&$SQ  ~ >Hn5:-Q/5!W4*W&$SQ  ~,5*W&$SQ !^N#F-S*TW"TWT5*W&$SQ !^N#F-S*TW"TW*W&$SQ  ^*PW"PW!W4#4*fW&*PW+S*W&) "RW:-Q9W*U"jW*RW*U*TW *LV *V *nV |O:.QO:T2UO:T2T:T2T:T2T|2U!T2.QW"T*T&PS*U "ZW*RW "VW*T"`W*`WW !T͕SC6*`WW 6*`W#"`W6!W6n&))lW  ^#V"JW*W&))lW >͒S:WH9!W6>JWR>fS:WHҶ6!JWVS+s#r!W4Ã6!JWVS+s#r:W8*W&)*&VWR"(V*W&$SQ  >«7*W&$SQ  ~h7*jW6 *jW *VWs#r*W&$SQ VWR+s#r*(V *ZWs#r:fWZWR+s#r:fWjWR+s#rë7*(V"LW*W&$SQ  n&)*&VWR"(V ^#V"NW*LW"(V *NWs#r*W&$SQ  >£8*W&$SQ  ~48*jW6 *jW *VWs#r*W&$SQ VWR+s#r*(V *ZWs#r:fWZWR+s#r:fWjWR+s#rã8*(V"LW*W&$SQ  >o&)*&VWR"(V!Q  >ʂ8*(V ^#V"NWÐ8*(V ^#V"NW*LW"(V *NWs#r!W4>JWR>fS:WH8!JWVS+s#r!W4ç8!JWVS+s#r6!W4n&))lW  ^#V"JW\6!W6>!Wc9*W&,V) >͒S\9*W&)*&VWR"(V *VWs#r*W&,V) VWR+s#r!W4 9!W6>!W9*W&)*&VWR"(V*W&NV) >͒Sʽ9*(V *VWs#r*W&NV) VWR+s#r*W&pV) >͒S9*(V *VWs#r*W&pV) VWR+s#r!W4h9aB!W6>!W::*W&W) *W&+SFQ  N#Fq#p!W4:*V*RW*nV "RW> U͇SUzSH҇:*TW*U|O:.QO:T2Uá:*TW* U|O:.QO:T2U!U:T2T:T2T:T2T:.Q2.Q* U}pS} URU͊S"`W> U͇SUzSHB;*RW|O:/Q2T*U}pS}URW"\W*T&PS"XW*T&PS*U "VWÇ;*RW*`W|O:/Q2TW*U"\WO`iPS*`W "XW*T&PS* U "VW*RW*\W"T*U|O:T2T*W&)*\W"jW*XW"ZWWTS"U*T"`W*`WW !T͕S;*`WW 6*`W#"`W;!W6!W6!W6:5Q!WS<*W&+SFQ  2W!FQ  ~:W!WHL<:W2W:W2W!W4;:T2FQ!T:/Q2GQ:W<*W&+SFQ  O:T<*W&+SFQ  N`iPS!͕S"`W!FQ :T w*W&+SFQ  N`iPS*`WiS!q#p!W6n&))lW  ^#V"JW*W&))lW >͒S:WHғA!W6>JWR>fS:WHh=!JWVS+s#r!W45=!JWVS+s#r:WxA*W&)*&VWR"(V*W&$SQ  >0?*W&$SQ  ~>*(V"LW*W&$SQ  n&)*&VWR"(V ^#V"NW*LW"(V *NWs#r0?*\W*ZWs#r*(V *XWs#r*XW##"XW*\W##"\W!W6*W&$SQ  ~!W ?*W&$SQ ^#V͛ 2W*jW6*W&+SFQ N`iPS!N`iPS!͕S  *jW q#p *jW 6*W&+SFQ  *W&$SQ |S+s#r:fWZWR+s#r *jW s#r:fWjWR+s#r!W46>:fWjW͇S+s#r! >w#6:fWjWR+s#r*W&$SQ  >1A*W&$SQ  ~¤?*(V"LW*W&$SQ  n&)*&VWR"(V ^#V"NW*LW"(V *NWs#r1A*\W*ZWs#r*(V *XWs#r*XW##"XW*\W##"\W!W6*W&$SQ  ~!W A*W&$SQ  ~ҩ@*W&$SQ ^#V͛ 2W*jW6*W&+SFQ N`iPS!N`iPS!͕S  *jW q#p*W&+SFQ   *jW w*W&+SFQ  *W&$SQ |S+s#r@*jW6 *jW *VWs#r*W&$SQ VWR+s#r *jW 6:fWZWR+s#r *jW s#r:fWjWR+s#r!W4?:fWjW͇S+s#r! >w#6:fWjWR+s#r!W4>JWR>fS:WHhA!JWVS+s#r!W45A!JWVS+s#ru=!W4n&))lW  ^#V"JW=!W6>!WA*W&7W *W&+SFQ  w!W4˜A!W6>!WaB*W&)*&VWR"(V*W&NV) >͒S"B*(V *ZWs#r*W&NV) ZWR+s#r*W&pV) >͒SZB*(V *ZWs#r*W&pV) ZWR+s#r!W4A!"W"W!W6:5Q!WB*W&+SFQ  ~¶B*W&+SFQ  VS*W"WB*W&+SFQ  VS*W"W!W4pB$N%N!bWVSDM$ :-QMC%N*WDM$ :U C$%N*WDM$ >W͇S>W͇SHHC!W6MC!W6͜͜!Ws+q*W&$SQ ^#V"W:-QڋC:fWWRbW͊S+s#rF!iW55:W®D*W&$SQ  ~2W!W6:W!WګD!fW:iWYD!iW6*gW#"gW!W6!W6!W6:5Q!W7D*W&+SFQ  2W!FQ  ~:W!WH0D:W2W:W2W!W4C*W&+SFQ  S+s#rcD!fW:iW2iW*W͛ 2W…D4%ͧ>äD*W&+SFQ  WzS+s#r!W4±CF*W&$SQ  ~2W!W6:W!WF!fW:iWoE!iW6*gW#"gW!W6!W6!W6:5Q!WME*W&+SFQ  2W!FQ  ~:W!WHFE:W2W:W2W!W4D*W&+SFQ  S+s#ryE!fW:iW2iW*W&$SQ  ~ڼEWbWzS+s#rYS:/QpSҹEd%ͧ>E*W͛ 2WE%ͧ>E*W&+SFQ  WzS+s#r!W4D>!Wq*W6 dWR>fS'F>%ͧ>ERROR: $ at line $Missing parameter variable$Equals (=) delimiter missing$Invalid drive ignored$Invalid character$Invalid parameter variable$!"WWͧ !W6!W6:W GG:WG͈K2W:WFIGF GF!Wr+s+q:U2W!U65FN*WDMN>FN*WDMZ :WCG.͜:W2U:WoG!W6TlG!W6sG!W4MG*W&W ~2W:W :W H:W HG:W ·G*W#"WMG*W&W ~2WÄG:Wa/>z!W/HG:W_2W:WG!W6:W!W6:W/:W/HI!W6>!W/H*W&W 6 !W4HtG2W!W6:W:W=H:W H:W/H~H*W&W :WwtG2W!W4:H:W=:W H:W/HҧHtG2W~H:W I:W=>!WHH!W6 I:W=HHF GH:WHcF G:W :W/H ItG2WHGtG2W!W6!T:W:W H:W/H[I*W&T :Ww!W4~`i+wtG2WI:W :W/HxItG2W[I!W6#6>!W҇K *W&+S P  ^#V"W! P  ~2WJ:WI:WA2WI:W0/>9!W/HI:W02WI:WA 2W *W&+S P  ^*W&+S*W"W*W&T ~?[J *W&+S P  :WO!=R 6!U6!W4!T5>!T҇K:WʧJ*W&T ~A/>P/HҜJ*W&T ~A*WwäJF GÇK:WJ*W&T ~Y*WwÇK!W6*W6!W6:T=!WڇK:W!WO!T ~2W, K*W#"W6!W6ÀK:W#K!W6 ÀK:W02W:W> !WHQK>!WLK:W2WQK!W6!W:WxK*W^*W&+S*W& sÀKF G!W4J!W6!W6:W:W/HK!W6:W *W&+S P *W& *W&W HK!W4éK:WK!W6K!W4ÒK:WL>:WWͧ T. T~ !W6!W6>!WN!W6#n& +S P  ~2W!W6:W:W/H N!W6>!WڞL'N *W&+S P *W& *W&W w!W4gL:W°L!W6L:WL:WA*W&W wL:W L:W0*W&W wL:WA *W&W w'N*W&W 6 'N*W&W 6='N*W&W 6  *W&+S P  !^*W&+SR"W:WmM'N*W~A*W&W wM:WʞM'N*W~ҐM*W&W 6YÛM*W&W 6NM*WNbN:WM'N*W&W 6,*W#"W*WNbN'N*W&W 6,*W#"W*WNbN'N*W&W 6 'N*W&W 6 !W4PL!W4'L>!W NT^ T :W]NT^ !W6>!WUN*W&W 6!W4:N!W6aN!W4!Wq'N:WO! *W&W w'N:WO! *W&W wO*TDM}oN*T†O]!O> 2 PW:TgxʀO { O: PO*T!O†O~#o}o|O<O:TzO<.O:TƜzO<8O:TzO:TzO:TotOzO:TgN!|!|PRTMSG ,QPAGWID 2QPAGLEN 1QBACKSPC 3QRUBOUT 4QBOOTDRV 0QMEMTOP .QBNKSWT -QCOMBAS /QLERROR  +QNUMSEGS  5QMEMSEG00 KQHASHDRVA6QALTBNKSA +QNDIRRECA ;QNDTARECA KQODIRDRVA [QODTADRVA kQOVLYDIRA {QOVLYDTAA QCRDATAF ;RDBLALV ))덑o|gS =S^#V))) DM!>)):S =2S_og^#V) PS^#V|g}o ZS_{ozgO{ozgi`N#Fogo&og_{_z#WBNKBIOS3SPRRESBDOS3SPRBNKBDOS3SPRCPM3 SYSGENCPM DAT . $GET 1âCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321SYSIN $$$Getting console input from $INPUT~FROM~FILE~STATUS~CONDITIONAL~FALSE~TRUE~CONSOLE~CONIN:~AUXILIARY~AUXIN:~END~CON:~AUX:~NOT~ECHO~FILTERED~SYSTEM~PROGRAM #).6=GNRW\`enu|[]=, ./;Error at the '^': $Error at end of line: $Invalid option or modifier$End of line expected$Invalid file specification$Invalid command$Invalid delimiter$File not found$Enter Password: $file: $SUBMIT of $GET from $ stopped$console$GET from $ stopped$console$Requires CP/M 3.0$CP/M 3 GET Version 3.0 $Get console input from a file $Enter file: $11N}0N|HG+\Yr'2ͅ !6 *& 6+!6:!D*& NZ *& w!4!":2"ͱ!6*& ~ w!4a!"+~2*& "!6!6%*: : H:HI%*:%*:%*:!6*DMͱF: : H:HÀ Fͻ : T :: H: Hғ: †̀ Ó%*:¨%*:½%*:*DMͱ:: H: H̀ ͻ v!q*&!p+q* !s+p+q*:w#6* *#"N#Fy  !p+q*!p+q*!q*&-!q:2!61!s+q:2!6*&"1m!p+q*m!p+q*<!q!6*&: >*&: :":!4!r+s+p+q+p+q: Di !6ͯ*~ʙ*~2*M2!6::ڃÓ*M2nãͯO:2 :22*~2!6*~2ͯ*~)*N! ** =2!!6!6:!:ø!4 ø*6 *:w:+s#ri :S*#"X!6:2O* ~2*&*:9ʩ!4*:w*&*:˜*&*~2j*6*~2Y:2!6*#~2!4N* :!6*&*:!6!4N* ~2*&*~2*M2:> !HV !4N* ~2*M2% :2#+s#r*N2!E„ *#"i   !s+q+p+q:=2ʺ *:w*#"Ý !q!6*""͐2:( !6(*&*&!s*&!s:C ::H, *+"C :C :++s#rͅ !6:!i *"*M !4K *M :Ҁ FÆ Y:Aґ ͅ *M! ^#Vp      ͅ !q!6:! *N*#"!4 ͅ !6:!V *!C !6^H  *#"!4 ͅ !q:at :{t : :OZ 2:ͅ ͅ l ͐ !6>! x 2 *&l :w:  : Ò : : Ò :=2O!l 6 ë : !4¢ W2!p+q*~A *~@O:!6> !ڄ : \ .*&*~ } *&*>O!4F ">ʰ *++"~Ұ "lp̀\`"̀*} *|2 : ͆ ͅ lp\`" *"ͻ ͐0 ͅ \ ͯ!p+q!6+6>!W *M[ :O[ !47 :!q*&*>*& z !6: ʍ ͻ "> "*DM) ҽ  *DM ͅ Í #: ͻ ">7*DM) 7"+*DM 6ͅ ">[?p͐0hͅ *DM !q"!+s#r:ʨ:=+s#r*DM!p+q*"!\"b"ͻ >ͅ *#"*~[ͻ :: H'%*:„:?ͻ %*:\yÁ:lyÁ:|yÁͻ $!6:£!6%*::Һ!6ÿ!6$::!6!6$::!6!6$::!6!6$ͻ ͅ !p+q*~ ~ HR*#"1*~^>>!`i^#V#~#fo͟]ƒywôG:±xAa{Ҙ_ ʫ ʫß`i~#~2#~2#~2*| \!\~2.n~`>26!.t~:s}>26!N#F#*"^q#Vp"N#F##"^q#Vp"4!7 !6ë7 \\m>_ 1:~# yɍWARNING: Cannot redirect from BIOS $ERROR: Auxiliary device redirection not implemented $ERROR: Insufficient Memory $""SYSIN SUB_og_ogDM!>))덑o|g =_og_{ozgi`N#Fogo&og~FGET :<***.n6.t6 LL!p:~y !6 <ʊ~"x!F#fh!:~!«!>w~:!5*.~w:; :~!9"1W:.~ !5< W@w.tEy!h g ={  ͩ* . +6.w   *ͩ2*.6#6*.~w#~=~# Ʌo$x(\!54  !F6ȷx(\>^\@_: N#x€ʹ> ʹ ʹŸ*.>wm#wM~xµmp> \ 8>""SYSIN SUB hhhhhhhhhhhhhh 151282 COPYR '82 DRI gggggggggggggggggggggggggggggg"D! BH!!$@ !HA@  H!@  @BP.@"y2;!"(:2(=2(:=;!~;4#.{2(!" "9"2!;(y3]K!o\b!,_^#V* !J ^#V̀:#!"(COPYRIGHT (C) 1982, DIGITAL RESEARCH 151282/(  + 1 7 = }!!!!"""""# ####$$$$#$-$A$J$S$@Y$u u J$u u }$$$$$*%P%$%&'('d'''(('({ A g X J v !)$*^#V#^#Vw# ll l ls:¬MA wM  2*7w#6?#7 .,:;[]=<>|!?]45#Ra{i_p# l s s͂:(A2= / ::0! dگ61#d ڸïp#:w#6 !6:6 *#!)6.#)͂ O(BDOS Function = File = !,!"h!9"f! ͉:2(t™:! =Hgo:O*;*Ó*"r*r"ÿ<:g:!͐*f}D! ~6t!r ͷO(^  : šn!6@G:x: P:<: P n6 t6! ^6 t6u:)<͠^! G:Ҏ>xʝʝw>ɯw̩z:»!>wɯ:=zxzz: :G:=/ͽx:Āy!4 5~y 5 6y(^@O:=7:y :I :=e:  zz#͂:!  r  ! O(Ì*( ~2* *}ʷ!#¶!""÷:_:*( #wxH! )6"& :!  x2 GH)+6:2, :!-  :, !+*( ~L#Bxz:* : *( ~ʓOڊ{2Ó#w:2. +:. 2- !% "( 2* ! "& !* ~4:2- Ԃ: Gͳͨ^2+ >2:2 *N#G2  :+ ̜2 5*( ~o#"( M š*( ~`Uoj*( ~#"( Ñ!* ~6s!+ 6:+ ‚xoͳ*& ~2+ o#"& !+ 6M : W:2 x ͺ*( +"( w  : >2* 2 :*( : +w"( ͺ:G:  !% "( ^-:* $P:<\: W:2 xM s:<9>2 :* 9x~+q ’x2 :* ͂^2 ¢ů͠: !ڽ*( ~5WèjM 2 ͨx*( +w"( j>2+ 2* jx. #NzW:  : !2 W! 5= ^x^ z: m :* ;#wO: 9ʌ ^:  ~x  ) :* :   >*( +"( w++2+ 2+ p!" r y< < <% zr ͷr 6r 9r MDÌ:o !6!h : ʚnt2 r 62 >r z<*)$"!z<~r s^#V#N#FxN:oʲ ̀õ (# Þ CP/M Error On : Disk I/OInvalid DriveRead/Only FileRead/Only DiskPassword ErrorFile Exists? in Filenameò ò >2(a." :(2:<:5(5(;(:(2ɯ2(2{_zW{_zW ) 74#4#4)7( #  w#*J|^#V#"i(##"k(##"m(###"o(#"q(##"(!s( )*s(!()*(|!(6~67*k(w#w*m(w#w#w>2('å2(*OͶyڲ ò <*e(Ͳ:0!(:(:(ò 2*(>*ͫ"(!(s#r#p*k(N#F*m(^#V#F*(:(O}|y9*( +"*( }|yP#9*( *(DM"(*k(s#r*m(s#r#pyoxg͝DM*(0MD"(!*MD$:(Oë!(N:( «G>O:( ù* :(n` ~#foͤ2(O"(}:(O*( "(2("(:(O:(G2(!(w*~zWw+ !z?#~*!* *G!O~2(~m͗O~t>2(?:(2(O:(w:Ғ4~:(w?r##rp# ä |g}oì*g( #G ¾1*q(:(*w***> r )e(:(O!*c(:(Oͫ}@2æ  ~á *g(:(o$*~K6?~wKw**i({#zir+s{ozg*(*(|g͸*u(*(  R>22Z$w*q(>ww:(c( *(#*i(s#r*:(!(:G~#<*q(#~!;(!(!(!~6k!"2(*q(N1q*{(]*{([*y(}<^#V(t6 ^#V}e ^#V#~2(>â9͆>!"(*y(³*(X)*ÿ͂"*g(*K! ~<:wb##>w#w> r !~#<!"@*(*#":&2(͒:È0:+Òy<_W`iͫDM*w( ~bNpwDM*w(T] KKͦ*w("w(ͦ"w(@ :(N N#Fy*(}|h#ð*(ͫ# 6RX*q(6wDM*w(6# x *o(w*(*w(s#r̀*i(6#6*}("(w@*(|<ď+>!8>8> t>nͦv8 ~*o(wn:(r :(/GyOOA +¬ ¢y2(:(x¹o&:(W>OͫE:(ڟ?N/*"(y2ͦ+>2( ̀2(k,ºʺ*(*iҺ@:O~2(~WW:2(Ôyʛ?ʔx ʔ |̷ÔN͆G:(<2(x# W:(<­:2(2 G?>Gr x~:(2(Ô##~*$*">2>2: *(~w *" 2(>ʄ@~k:((s~*9~Ês~ ~ͅ<Eʀ@~›:(6!¦w͚̋,ÇPY*({zBKNyʺ Nú # #>? ;*~ w-xąH"(0 *(#ĊH( ,ˆʀHÈ2(xą ):(@O~#w͚ʀôb_++V@* )͗Os++r!x>w~6:(6~#+w#w+~;wɯ2 K,OFq-yl?Npg&:(ʓ~†wŒ~è# # x ͗w w@ ~wb͐Ú!"*>o+"! *!b("": r#~?w#>r# L=J! Lv w,b ?~O ͆=: <>w##~2( 4~?¹:(<üAX2(r K:(w++~=wv 4͗O5:(2(X:(!(v q: v v Mڂ?Ͷ >T͓Â!"(>(Â:(G:(O:(h=2(7ryy/W!(:(lڈ>F6:(_/G:(ʧ:(ڨ|OͤG:(_OzW{|:(*(}|BKN zyG:(2(9:(>#:(>#*+S!X:(ڜq: ʺ!((ʵ>2( ͤ2(O DM͸}>r "("(2(:(2(* :(:(FsO s#r:(„y==„*(!(^W*y(^#Vx+7=2(wͼկw#KWK*("(J T͞*(:(["(Ͷ:(WMںʛ>(úͶ >TJ:(!(ʷ͞x!(w4 PWP  Â*!!~~#~O~#G~.|°! w:ck[!x?[! ~ʤ͆[͗PPv qO-á=.: <ʰ! Vq##~_@w: <œ. ʩ.ʩA r r##s <}r cN! ~态O>G~G!~G~o>_yW#x#W{s+p+q7r#r#r>@ >2  !!q#p#w2(wW*e(_3ҫ -!(s:(!(xQ*q(~wɯ2(2(ù*~2(~w#~2(~wZ!""2(=2*~2(=2(2(k:*wX/ 6X*̀!~$6:03i"!~6*e(>=)Q!(QX<k*{(}<^#V{!~! _*o(~s̓  2@ !()#w*~"!!(Fw̓ :(w̚":>#2(̓ *~wć"#Fx T]## #~ ȷ   *4 # '  4 !( *~^ ^ 33G# P v :dv 6 y #*~w>2 *p@! ~*"v@*w# ) 6# ͙   !N)@ u :G*g(`~!x_<_@!*o(y<:(/G?~##~? 6!K@?F6##N6 2 p##q:r !Z$2!"ög:(2T͐-:ʹ!>2<2(!!(w: >2(*6!O~2(+A@2! ͚A=: <%~?¯"k"?~?ʾ"ZT͐"*>o"͒"!:O"(Ý"͐6͚͚c2(ZT͐-3#͗#@!Y#sY#̓ Y# Y#ͅ:(As#:(@#@!#$̓ —#>2—#͇ͱ * «#>2(͙ wB p'+!#:(w͚AP{" 2! W>O2 ø ͐R*e()$:(r "ök*w()$*c()$-͐ͤÀk*s(" :(;$:r 2͚ù͚͚}/_|/*e(W}_*c("e(}o|g"c(>2({2{2g*w(ʪ$Ң$Þ$+}$*(#}o|g:(O *s#r#w!~w/~@w//Hͥ*e(>=)%_g:0%w% %:(<%R$Hͥ:(>(~c!o#~E%^#V)$G#~#~!%~ b%% k%%##N#F#^#V#~#fo~o!o#~>T}! 6**#K" G*~ xr ͐-xą@7(͚S!ʀq&&͋"&@6,͚%Xͤ͋&͗wO~<:( g&~w#w#6##)͋&@ * g&~?G++N͆p# Þ&͐*6!¿&?~p*6 &>2ͱ ! ! ͷ w*o(w'ͧ B pͧ ,Úgsr ͐-ͤ͜!S')_'ͤ̓ ~?w͐s-?F͜p!'̓ ¡'>2ͱ ?~¾'¾''''>w'͙ =2(͜!:(wÚ~̓ ʑ'pá'!(6NN!(r )!(N !)z<*)$"!" :X(*:(w:(w#:(w*2* }D#cdfg!"()*{(X)^#V!"(:(<)!~<<)^#V*(<)"("(x+)!(*(>X)*{()Q*:(_2({2(Ē*"(͂"X*~<)ҍ) -)a*ʚ)~)6*(:(X*)!(:(T>q*k)!(:()-6>)ʴ+>2d,:+#++>29+2~2#! , , ,)x,) ,O +"!w [,O?WGzO:(V,xGyOG,xwq*}(}2*i(^#V+ d,!(K*}(@+*)):( K:(ڗ>2#-×:#-<)2#-*(BI$"" HB@ UUUUUUUUUUUUUUUUUAPDA$! @I !@D@BDI@!B$ @$I$$ "@$$@@HHBD"D$H D@!IB@ A"B HBIB$$ "$ D$!"D$H$D$I@D BD" H$BHHBDHB"H!"!!$$HH !"BB$HHDA! "D"H $B!$!AI!$ $ H  H A$I! I" $$BD"$H "AHD @ I  B"$$H @@@@" BHB  !I$ @ $@$"$AI$$IBI$I H@@I!$DA $ $@$ !$!!" !$I@I $@ $ @!H"BI"HI DIHA DD$HH $  B D$ "I$I$H$ I !  $I$I$I $@HD$@!$"A$A DBIDB  @$$DD""I $BHI$IB !@"BD BBD "@B @$ $BI I B$@" ! "H !$B I$D@! !$ @H!$$D"@A@ DHII  D@@ $ DHI"D$ @ $""@ B! @@D $$A$ $D "@I $A$$I!HI$ BA$ $DH $I$I"HI$I!$DB$"B I$$I$ !I$@DBB$@D@"I A!$ @  @  "$ $I$I$ B!$@ I @I$ HBDH$ A$H!$D$ $I"B IIBB"$B@DH"$$ IH $$ !I"AD B!B  BI$A$"@$I$!!""@@$Nwy!"(9"f1f! Ҕ2! ~#foCOPYRIGHT (C) 1982, DIGITAL RESEARCH 151282KK{<<ʽ<K : >! ~6 69BK! OS}!,"**NK6 :+OK2$^#V#N#FxNp:$p:Gjxj Y# A>QFQx>QGQx3ڰbڼqҼo5p5"""*!yb! ~G*!NKկ2!*$K*"x!*!@$@hK\K:K ~#~ w*NK*NK^#V#N#F!",!."*K6*}ʴ}<ʴ.}o|g "($Kt>=2(*f*(}DɯQ"(>QKQKQ>Q"%Q!2*%DM**ѵ+)) H~#+}#<:<ʲ<77:<ʢ2~77ø~7"9:OG#Q{ozg# ""BBÃà à ÃÃ1j$|@ "H$UUT$$ $I D$BA@! B$$A IA $!"  @$@$BI!!@""$DA  $I$@!ÞCOPYRIGHT (C) 1980 DIGITAL RESEARCH @RELIRLFATAL ERROR$l$l1 ͺ!"!6͓*~=:!ͣ !6:/::!ͣ !6:!!/ͣ < ͧv! s+p+q> ͍"̀ځ*>! q** DM* 1q>> ͍+s#r=>!r+s+q+q+p+q> ͍"!6> !*&*6!4¦:! *w* * * DM -* *s#r*"̀*":*. Tu -". u -2:~ l:\.~ -Ql.~ -dup. du -zT!"u*M: *M: !6>}!: :<2¨#u{u>!͘,T>͍)*DMTT"*%DMu{̀+s#r;'*DMu{̀N*"'ͅ>v":2T2u:ҙu͟!6>!ڙ: :<2:ҦT͟:!/Ҵ:͍ >>l͍ >!͘:/H*!*"'*DMT{T:lͪ : >>l?: &#*DMu{:2:2u͉Tp*>@O>*>@*w*~!s+q*&%*& *&%*2& "*DMT*+"*DM3T"!p+q!\#s>!s:+&:2̀&ͣ :22ͧ!s+q+q*M*͍"̀̀Hm*DM̀%*& "!6|*#:w*##:w* :w!6!6\2!:!H÷:!!6l+6**͍!6\* ^#V""!3"$"!o2ͣ :< J.< -B3!6#6!6*#s#r!6\wl!6!6!6\ʒÇ.  -›!&6:!&:&=O! N,:&<2&©**pH*#N*##* ^N0Jͭ1 Gͤͣ  <_1D**M*0G!'q:w**M0*"!6}!6:'҄Çͭ1Ҙ**͇H* >͘ҿ:'/**M*0} <_1K!6#6#6:  . - 12(:( T}L :2:2!:y :2̀y ͣ :22!""*"!6!6: *")*"*K: *: !6#6l: *)"ï !6l+6!6͔ :  G. - !"!\"!"*^#V" $!^q> !^] :^0O,h :^ AO,!_q:_OD :_OD !ap+q>`Mi !`\Mi !cp+q*bDMG!ep+q!d\+J<!hr+s+q*f&4 N,*gDM͵ DM̈́  ,*3&+) >>l!C9 < ,*3&+) ^#V*3M  ,!iq*# :iw*#"!͛o #*DMu{!"*!*"D*!s*D!s*D!s!6*!*"D*!s*D!s*D!s!6*M: *M: *M: O`iN928 "92;!j6:;!jU :j=O!< Hq!j40 *8M*9 !k6:;!kڇ :k=O!< N,!k4g  ,!lq*' :lw*#"!͛ '*DMT{*!*"!"!ns+q: ͪ :n!O> !>O:n2nO!mT!w& 8 !w:o2% & *M͍ !6!6:n!2oK :m!o>O!mC!pq*pM !rp+q*q}OY *q|OY *8M *9DMg *;M !s6:;!sھ :s=O!< NY !s4ž !t6:;!t :t=O!< N: !t4 : 2u: :* *uMi  ,*3&+) N#F+q#p!C6:? *uMY !vq "w:R:ҕ *vM*w *3&+) N#F+q#p*3&+) >>l2C:Ҵ *vM *wDMg !yq:y/:yH >!y# :y::::y8*;< -*:;2:@:<!C6*y&>) N#FG>!ykb :y/:yH҅V :y ¦:823*3&+) *9s#r:y!"+"-"/"1!36<::y<@ Gb :!:y<b :I:y/ *yM :y#~ >!y/͐ :yI:I 7:[:y[Ϳ o >á2zO>Ҏ*zM@:zá2z*zM͵:z,=>)-,),>,=*#"!|p+q*{~**{ >*{#"{>ʹ*~>~,H !6)!\""!o)ͣ !6!6ʹͼi**& w:<2cͣ ʹ7*~-w!6*~)…!6:ғͣ !6*"*~)*:º!6***̈́:*:!6!6lͼͣ Þ!6*~>ʤ*#"}!6*:3ͣ *~=X!6*#"}:X!"}**Ҁ* *}s#r*>wÑ**}̈́ͼҡͣ ʹ*~]*~D!6*~I!6*~M!6*~P!6ͣ ʹè!q!6!6*"ʹ!""!o8ͣ >͍J!"ͼҍ*~(c͆Ç*~_[],()!q: > :a/>z!/H:_2:!p+q*^#V"*##^#V"!6 !6+6:W: Q!6l<*6+: m+_Ax!!6Aڙ:ڐ!l+}::*~:Hھ!*#~A<*wO>!*&*6 '!6:.+A: !l+: !*&*\:<2O* N2!6> !i*& :b>!4F>:<2O* :w:!4~ʶ 6*#"*{zڶ!"ͧ*!~2xG:2G:p ˆx!4~ 6*#"*{z!"*!~2xG:2G x{_ C#5>ɯ$!p+q!6> !ڌ*&*~ x*&*N,:….,!4Q!r+s+p+q*DMG*DMFEͣ !s+p+q+p+q+p+qWͣ !">͍+s#r!oM*DM`:$*DM͐O>!>͍ ͣ !9*DM͠O>9ͣ *"*#"`!r+s+p+q+p+q***DMͮ*!r+s+p+q+p+q***DMͮ!p+q*DMp!6 > !*&*6!4²*DMͰͣ !p+q * 6 * 6*DM̀*͍!p+q*DM+ͣ !q*& , ,!p+q*  !p+q*!p+q*!p+q*! p+q*! p+q* ! p+q* !p+q`*!p+q*_{ozg_ogDM!>))덑o|g = DM!>))4 =,_{ozg~ D^#V) N~ U^#V|g}o `_{ozgO{ozgi`N#Fogo&og_{_z#WLIB 1.1 $REL $$$IRL $$$INDEX ERROR$NO MODULE: $SYNTAX ERROR$APDCentry symbol $select common block $program name $request $error 4 $define common size $chain external $define entry point $error 8 $external + offset $define data size $set program counter $chain address $define program size $end program $end file$FTiw(5ABORTED$DISK READ ERROR$DISK WRITE ERROR$CANNOT CLOSE$DIRECTORY FULL$NO FILE: $çCOPYRIGHT (C) 1980 DIGITAL RESEARCH @? OVL LINKING $ $ 1L9M9!96w:o9!9D:!""!""!"9*9^#V"9"q::u9 ͥ6**=;"`:"b:q:b:͞8.96`:q:͞8"9|!96wj1:9R,v!!]:ڤ*]:&f;) N#F͋41!]:4:u92:2:2;2E;2u;2;2;2;!D:6+6!E:6!"p9!"m9}2o9!z962v92x92w9!t96X!"y:"{:"}:":":":":":":":":":":":":":"i:"k:"m:"o:}2:!:6#6#6*9"q:2C:2D:2E:2R:!"X:o&"Z:|!"s:!"p;";";";":":";"7;*+":*+":*+" ;*+"9;!":":";"?;!":":";"A;:9*b::9=o&))9  ^#V!!<4*<&^<) <͞8-*<&^<) ^#V"d:M*<&^<) q#p!<4*9&))9  *`:s#r*A:)8"p9*9&))9 q#p:9<29O>D:9=29D:9ڗ*9&))9 ^#V"p9  ^#V"`:*`:DM!96#~ͬ . ":\ -:+: .+: -:9":5*.:~=ͬ :9('*.:~(*.:~)H^*.:~,NDͬ :9['(:9vC()!o96>5!B".:ͬ . ":\ -ˆ*.:~=Ÿͬ ï.+: -§:9ҹ'*.:~*.:~(H*.:~,Dͬ :9'ù:w92y9:9F:9(C(͆7:9):o9:o9H4!"p9>:o929*p9"95*.:~(*.:~ʐn*.:~)p̀^*.:~*.:~(HҍDO:9ʛD*Ͳ!6~̈́6*& 6:[],()?$! : @: <_2 <: !#<ڲ*#<& :<«>!#<4>*.:#".:*.:N2<&õ͵:< ͵!<6 !%<6+6:%< :%<  !<6͸ !\6͊ !!%<6͊> :%<5 !͸ ͵" :<:„ :\:%<Hb !:]A<2\O>v !*%<&\ 6 ô !%<6:<.° ͵͊ڰ :%< ڧ !͸ ͵Ô ! :%<<2% :<02<> : :>!"&<͵͊6 - *&<))))*<& "&<0 D͵ *&<:/͵: W :ZD͵:ڎ :!Q: D*Q:&J: : >!:*!^:6+":^:$t 8'> *0< ~L*0< DMB5*0< 6*0w#6!4w#6*0<##N#F*.< ~O`i~8p8!6Ͷ8ikS*0< DMv5*0< DMd5*0< *0<##N#Fq#pä*0<##q#p*u:#^#V*u: ^#V*u: ^#V*u:~*u:~*u:>*u:~*u: ^#V*w: ^#V!8:=<Hw!>:><Hw!?:?<Hw!@:@<Hw!B͔8>ͥG<8'*u:"w:*E<#"E<ͺ"u:>͔8$>ͥG<ͮ8!TJ<ͫ8:P<Hr:Q<ҁ!U<6 Æ!U<6:U<q:ͫ8+s#r!`:͹8ң96:T<Һ*JE<ͫ8*P<&i:) N#F,DM,*LE<ͫ8F*P<&i:) *q:s#rN*q:DMͷ!V<6>!V<ڷ!"Y<*V<&i:) ^#V"u:>u:ͫ8ʝͺ"W<*Y![<,*[<&i:) ^#V"u:*[<&<) N#F.>u:ͫ8%OkͥDMͪͮDMͪDMͪͺ"u:![<4!"i:"k:"m:"o:*d:##6*d: 6*d:^#V!`=p+q*d:*_=s#r*d: >!a=q*d: :a=w*d:##>?!b=q*d:##:b=w*d:##~*d:##>w*d:##~*d:##>w*d: ~!c=q*d: >:c=Hẅ́d:8++"\<*\<^#V!e=p+q̈́d:8++"\<*\<*d=s#r*d: ^#V!g=p+q*d: *f=s#r*d: ~!h=q*d: >:h=Hw!k=s+p+q!^=6:k==2k=ʱ*i=:^=2^=*i=#"i=Ñ:^=2^=!n=s+p+qͽ"d:`:d:͞8͹h!n=*l=*d: DM*n=>*>̈́d:8+s#r!r=s+q+p+q*o=DM*q=̈́*^=&^<) ^#V"d:>d:ͫ8ʆh!q=}*o=*d: DM*q=>*}U!r=}>M"d:<>!|=r+s+q+q+q+p+q+q+p+q:u=2}=:z=Һ!}=44*`:"d:*}=& "`:q:ͮ896<*s=DM*u=̈́*^=&^<) N#FU*^=&^<) *d:s#r*}=M͍*v=DM>*y=M*u=Ms*x=Mf*u=*d: *s=DM -B:z=Y*{=DM*d: ~#k!{96 MODULE TOP $UNDEFINED START SYMBOL: $YY???? $$$XX???? $$$RQST$ UNDEFINED SYMBOLS: $ABSOLUTE $CODE SIZE $DATA SIZE $COMMON SIZE $USE FACTOR $!=q*=MͲ!~=4!=q> !=8:=0OͲC:= AOͲ!=q:=O:=O!=p+q!=̈́8MD>=08MD:;!t;!;!;:u;2\. ] -Ÿ\ͩ6!t;6!;6!;6!;6!=6+6>!=*=&f;) ^#V"= *= ~ *= DMv5 *= 6!=6:=<2=:=7::2\. ] -)\ͩ6*p9###H:ͮ8!D:U!\:6*p9###F:ͮ8!C:r!\:6*p9###X:ͮ8҉!\:6:R:>S:ͫ8:U:H:C:/HҼ!\:6!\:6:E:!C:!\:6!\:6:C:*F:"::\:*p9###":*p9"::D:*H:":8*:*:"::r98*:)8":*:*:":Z:X:͞8_X:Z:͞8#"y:e!"y:!:6*X:":!=6>!=ڞ*=&y:) >Ͷ8Ҕͥ:=<2=v!":::2=!=6:=#w:==2= *=&:) *=&: N!: ͠8*=&: ~2=*=& :=w:=2=:=<2=õ*=&: :=w::<2:*b:"d:`:d:͞8q͜/!9H`2UO!: 8DM>ͪ̈́d:8+s#r&!]:6>!]:7*]:&f;) N#F͋4:*]:&<) N#F.B2=:="="=:=O>"=n2=ð-*]:&i:) ^#V"u:>u:ͫ8-2=ͥ"=ͮ"=!"=nͺ"u::]:<2]:w!=r+s+p+q*=}*=_DM͘4*=#*=|_͘4!=p+q*="d:2:=2=:=O>Ґ*=DM^"=ã*=&:) =8"=:=O>:=O>==͞8UO!: ͹8"=*=*="=*=DM*=8*d: ~*d: :!z9/H!"=ͽ"d:`:d:͞8HҴ>=08>͔8S6!~=6U`/wUp/>=08 \8 M`͹ҖÞ2DM_   *=#"=̈́d:8+s#r >!=Ͷ86!=6>#w#62~=ͽ"d:`:d:͞8N/=:=!=6>=08>͔8'6!~=6w*=#"=>&8)))M`̈́d:8+s#r>!=Ͷ8\66!=q!=:~=v d!=6h!=ڤ:==O! *d:N:=<2=|:E:J:*Q:M2"V:!"V:|!=6:Q:!=:==O!J: NͲ:=<2=6D:R:*U:&:) S:8"V:D>!{:Ͷ81*:"V:DX:ͣ8D*X:"V:Z:X:͞8mX:Z:͞8#DM*X:v6*:DM*:6*:DM*:6*:DM*:6`:s:͞89ͮ8*9|=ͫ8 Ͳ(Ͳ*=DM_-Ͳ*=*=+DM_)Ͳl*|9DM_68f ͥOr:t9Z^E.:n~:x9ZyU/?OVLAY?OVLA0RELIRLIRLREL))O`i~8p8>!:!>6::!>:>=O!: NͲ!>4½)2:͕":)2::: !:6!>6::!>. ):>=O!: Hq!>4 *h&\8*|& "9>*7:DM\͏5*9+"9!>q:>2]:*]:&f;) N#F͋4!>q:]:!f:Ҏ *]:&y:) N#F*>͘4:]: Z:y:͞8Ҽ *y:"Z:X:y:͞8 *y:"X:*]:&y:) N#F+q#p!>s+p+q::2>O!: :8">*>DM*>h!ͮ"!>2>:>>!>ͫ8HA!ͱ!">G!*!>">*>DM*>MC:>e!*]:M͋!*>*>*]:*>*>5:=Ҭ!ͱ!"!>>͔8ž!*!>">!>6í!!:]:2%>*>M^ *>DM4*>#DM4O`i~8p8"#>*%>M^ *#>*b:"d:`:d:͞8%"*d: ~#"*d: 6̈́d:8+s#r!!{96:*:MH"H"!^:6:*:Mi"2"g:͜2f:o"=6*:::: -y"::29:*::ͺ/Ҵ":*:͉:*:M"!:͹8"/Ͳͯ/Ͳ Ͳ=6#:*:*:*:*:͉*:*:"::*:M/I#:*:͉*d:DM :*:Mҟ#{#=ͯ6Ü#*:&:) :8DM>*:Mf#:*:*:&:) :8*:͉*]:&y:) N#F*]:*:DM5!=6#!=6*:":*:M^ :]:$$*g:*:":C$*]:&:) :8*]:&y:) q#p:]:P$!=6*]:&y:) N#F *:":>!:Ͷ8::HҲ$:R:Ҕ$=6ò$*:&:) :8"S:::2U:!R:6:0:$)$ò$!&>6>!&>%%*&>&:) *&>&:) 8*&>&:) q#p*&>&y:) q#p*&>&:) >w#6:&><2&>$s:q:͞87%*q:"s::G%͸*9"q:^ :_:/2^::{9]%!!)>s+p+q:)>ˆ%*g:*'>"'>:f:҅%!)>6Ý%*)>&:) '>8+s#r*]:&y:) N#F*]:%*'>DM*)>M͋%*]:&y:) N#F*'>*)>*]:5y y !*>q:*> &>!*>&:*>#&+"ÿ&:*>1&p"ÿ&:*>?&k$ÿ&:^:ҿ&:*>=O!& ^#VI"ÿ&ÿ&͈"ÿ&>ÿ&͵"ÿ&#ÿ&T#ÿ&#ÿ&#ÿ&$ÿ&$ÿ&Q$ÿ&d$ÿ&W&]&`&f&o&u&{&&&&&&&!+>6)&)2->:^:&*->My (')2,>')2+>:+> '*+>M%('͕".>:^:('*.>DM*,>^%:+>&7','!0:6&H'='!0:6!"1:"7::!:'*:͗8"1:"7:. 9\ -u')29!hʦ':92h\͕6¦'\=45)2|29!:6*7:"1:!"9"9^ :_:/2^::!:!_:' ',':e (.e -'e>*2!:\d5I'}/B(}͉ͽ"d:`:d:͞8)͹(:v92\!0>6>!0>گ(h!0>҈(*0>&\ 6 å(:0>=O! *d:*0>&\ w:0><20>g(!!:6.e -¼(\W5/(!!:6.e -(\d5*d:"1>!_:6I'*1>"d:̈́d:8+s#rI(.: -)!:6!:6^ ͽ"d:`:d:͞8)/)*{:DM>fy ^%y !":y y *d:"4>#*4>"d:!3>6>!3>)h!3>ڶ):3>=O! *d:Ny û) y :3><23>Œ)*:"::)͸*9"q:̈́d:8+s#r5)!0:4~ (*6*1:#"1:*7:{z*!"1:/ *1:!>~26>xG:6>26>G )x{_ P*#B*>ɯ`iq#zV*COMPRLRSPSPROVLSYM!;>q*5:> :;>w*5:#"5:!3:͹8ڦ*>*3:DM\͔5!"5:!<>q:8>!<>28>:7><27>*!7>6*8>Mq*!8>6!=>q*=>Mq**A:#"A:!?>p+q*>>}O**>>|O*::+:o9+h,*p9"A::\:,+**V:DM**X:":!@>6::=!@>q+*@>&: N!: p9͞8j+*@>&: N͍+!@>47+:o9:o9HҌ+ -!C>q:C>¢+*X:"D>ó+*C>&:) ^#V"D>D>A:͞8+96D>A:͞8+*+*C>&f;) N#F͋4*C>&y:) >Ͷ8,:C>,*X:DM',,',|9A:͞8&,*A:"|9!G>p+q*F>"H>*C>&y:) F>8+!H>͹8g,*H>DM4O**H>"H>3,::=O!: N!: !y: 8*p9͗8"A>**A>DM**:o9,***p9DM*,*m9DM****:r9,*:DM*,*!J>6>!J> -*!J>4,*p9"A::\:(-ͦ-ͦ-ͦ-!L>6::=!L>|-*L>&: ~2K>u-*K>&:) A:͠8e-ͦ-J-:r-.u--!L>4--*p9*A>A:ͮ8ҕ-ͦ-|-:7>ʥ-ͦ-Õ-!O>q*O>Mͧ**A:#"A:M>A:͞8-ͦ-ù-ͦ-*K>&i:) ^#V"u:>u:ͫ8.ͥ*K>&:) 8"M>͹-ͺ"u:-*K>&<) N#F.*0< ~R.*0< DMd5*0< *0<##N#Fq#p].*0<##q#p2P>:P>ʤ.*K>&:) 8"M>"9:P>O>Ҙ."9͹-2P>c.>5:08>͔8ʾ.q*å.>*5:DM\͔5\v5:w9Z.. \": -.:e /.*o9&\8_* DMe - /:w9#/:w92\\B5:9 A/. ~9\ -9/!"5:}28>27>*ͥ.:x9Z^/. \": -f/.en* -v/:x9ʌ/:x92\\B5!"5:}2R>ͽ"d:`:d:͞8(0͹/H02DMv0 q*!Q>6h!Q>/:Q>=O! *d:Nq*:Q><2Q>/:R><2R>0 q* q*0 q*̈́d:8+s#râ/ q* q*ͥ.!S>q> !S>O0:S>0Oq*Z0:S> AOq*!T>q:T>O60:T>O60!V>p+q*U>|O[0*U>}O[0*9>!=8"W>*W>!=8!Y>s:h0:Y>2h\͕60\>645*W>!=8!|s2*9͗8"9>. \~9 -0:9 1*9>"9>\d5͍0C\͏5!Z>s*9>!=8C "9*9*|9s#r͍0C*Z>&\8DM\͔5:j2j\v5:9ҁ1*|9)8"|9:y9ZŠ1a9ҟ10ñ1g9ұ10!_>q.*[> :_>w*[> ~!`>q*[> :`>w*[> *[> ^#VN#FR* *[> 6*[>^#V!=8"b>?8!a>s1!a>P2*[> DMv5*a>M1*[> DM͕6P2*[> DML5*b>!=8MͲ1*[>  *[> ͞8ҍ2*[>  *[> N#Fq#p *[> ~ڮ2*[> DMB5 *[> 61*[> N#F*[> *[> N#F͔51!e>p+q*[> N#F*d>?8^8*[>q#p*[>*[> 8+*[>##q#p*[>*[> N#F^#V?8*[> s#r *[> N#F`i"h>*[> N#F `i"j>*h>"f>j>f>͞8ڐ3*f>+*[> ^#V\8DM2_2*f>"f>\3*[> ^#V*j>\8DM2*[>  *[> ͞8Ҿ31*[> N#F*[> *[> N#F͏5!n>s+p+q*[>l>͠84 *[> ~4_2*l>DM2ͦ3Ê4*[>##l>͞8Ҋ4 *[> ~34_2*l>DM2:n>j4*[>  *[> N#FPY͹8d463g4ͦ3Ê4*[>  *[> ͞8҇41Ê4ͦ3!p>p+q*o>"[>!s>s+p+q*q>DM3*[> ^#V"]>*[> N#F*q>?8*]>:s>w *[> 6!u>p+q*t>DM3*[> ^#V"]>*[> N#F*t>?8*]>~   +5{>.+55OͲ5w66ͩ6́5;6<566́5͕6<>́5͕6<>645͜6<H66! w #ˆ5>Ö5>2,6""6"$6yo`"&6!"*6͋6-66*&6|6 "&6*"6MD6*$6DM:,65ͷ6g666Ͱ66**6|6U6*$645*"6""6**6#"*6ú56**6ABORTED$NO SPACE$NO FILE: $CANNOT CLOSE$DISK READ ERROR: $DISK WRITE ERROR$YYYP   YP6YPYPYPYPYPYP Ͳ ò!>6#6͐6">*>|$7>9ͫ8"|>##*|> ~!7!>6D7*>|?7!>66"|>D7!>6:>Y7!~>6#6#6Å7*|>~2~>*|> ~2>:>z7:>2>*|> ~2>!>6>!>ڰ7*>&v> ~/*>&: w!>4‹7:72"g:^ *:"|> *g:":*9My *9My *9My *~>My *>My *>My *|>":i`N#Fog_og_{ozg_ogDM!>))덑o|gV8 =D8DM!>))k8 =c8_{ozg^#V) ~8^#V|g}o ˆ8_{ozgi`N#Fogo&og_{_z#W LINK 1.31 $01/04/83?MEMRY$MEMRYX MEMORY OVERFLOW, USE [A] SWITCH$INSUFFICIENT MEMORY$OVERLAPPING SEGMENTS$ XXABS $$$XXPROG $$$XXDATA $$$XXCOMM $$$::;7;YYABS $$$YYPROG $$$YYDATA $$$YYCOMM $$$n;;;;INDEX ERROR$MULTIPLE DEFINITION: $MAIN MODULE ERROR$FIRST COMMON NOT LARGEST$COMMON ERROR$UNRECOGNIZED ITEM $( COPYRIGHT (C) 1977 DIGITAL RESEARCH 112O02Z0̀%!"K2.>2.*M0"$/̓%!"":g0i!"P0"R0"2:0v: 0$  :[0-ʬ+ʬ* :[0!_0M!f0P p  !   :O0Ĝ!":O0*V0}|<r ͪ*|Ĵ:O0_͑H *V0"Ù*V0"E V» ͪ»**»"Ù*K0"X0!0NA#~' ~p"K0*K0N"X0!0q#*w œ:0!x ͜ *V0*R0:_0̍"V02*M0r; !:r :0F: 0e%;m ">2:0b: 020 W,F:0b: 0e,ʹ:re*X0#![0~ʇww2/ͬ:2T/-"."$/2/>2.v:.ʸ!/6+͕%>20:.ʮ:.0209$<!5*}Ģ*V0":0y: 0:yv! X! ^#fkX _~ 0^ Z   2 5 8  :0‰:0=ʉG! 0ʃF#2sÖ*I0| E2V ,[ ͊m *R0"R0"P0 m E2D2V ,ʾ ͊:/ m :/ "> 2/:Į:0 : 0 -Ͳ !/6+:.;?*$/*."$/?"$/:.l*.^#V{r+s5*.^#V ʓ:. r+s!06#wÚ> 209!e/~6![0~6".~,#!0w9 9*.~6 *: 0,Ĵ2f/*.s#r2[02e/*.#"X0$<5ͬ*$/"M00:T/2:/2[0 v>20*.".2[0v*R0m "R0͍"R0!/w >=G*R0*I0"R0"R0 m :/ }>͞ ¥͢ :O0*V0*ʿ͜">2:O0:0:O0!!4:0: 0,>"4:O0: 2\0:0=: 0 F!Fʹ%*X0"`0>2Z0*X0":0k: 0T!T:\0¦:O0¦:0=ʦ ʦ*"X0 !':[0'Tx»!Z04TT!Z05T:\0!":]0!**V0":O0*X0~ Ĵ*X06 '>#G*I0!" :0 :Z0 !0N*K0:O0Ÿ"b0+"X0yʛ 'É' Ͳ >ͮ 222:0: 0 !ͮ-:0:0!4 :0& : 0::0!xI !4̨ e ::̮>͞ } !~5:Į ͵ !4̨!~5 G!~Ҩ4_!p!~ʮ5^!~> >2\0:0N *K0"+"X0:0 >''!:0N : 0,N :0 >  > !0N#~' ) > ''*K0"V0:\0x ʹ:\0" m }*K0"+"X0''*K0"V0>"4ͬ:2T/:[0 “ 2/-*M0"$/*X0!{#zڿ ~+"X0*M0+"M0wß #"K0*M0".:\0 N]T s#r+*V0*{_zW".:\02.R     % *I0:/ ͪ% ͬ:O0ĭ%  :.ʢ :0¢ *K0+"X0!2<20*#"" : 00Ĩ!??" 09"K0+"X0$< :0¢ : 0,? ʹ  *} :]0 :O0 :0 ͤ%:e0ĭ%:0 : 0  ͬͧ%vʹ   ͺ :0: 0 !;* _!5 ^#fkS \ h n 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y0P 2!0^4! 0q :0Ė: 0,; Ė*I0m |}$† ͌oy Ԍ͋ 8O͖ Ăy01y 1m X:0 : 0, >C͘%:0 : 0 v;:0 : 0 v-!v !v-ʹ {ozg:.7ͮ2Z0!O0~4l!"*|>"V0*""J͊!/6 !/͒%:^0ʏ>2.͡%ͱ*K0*T0&*M0*T0&\ ͍!/w#õH USE FACTOR !/͒%*"P0Þ%z{*P0"R0*"V0 !":O0Ģ*R0̜*R0ĜG:O0xě%:/ *R0̍:xz*P0#"P0E2D20:b!^4!/wjj*R0!6zz{z4A_A?ɯ2.2*T0"V0!.8w# *V0*K0{zҤ*b0+"X0 =$**X0#Þ!.*V0".#"X0$:d0<:0<! 0~?<#ʐ: 0͡!.".^#V"V0}{##~2.*.^#V#"."V0*V0}d##~<2.G*V0##"X0:.> u!.~w>w> u:.P'!5^!/~ !~620͕%2.|z}z> u!.~w:.W=*u!.4C*V0^#V"V0ý!.5¯:20͕%!^4!/w>R͘%>V͘%>Dý>Pý>Lý>Oý>Bý>Sý>N͘%*6".~ 6@-!2~B6~44O!! s#r!1~ _6^4! w!p!2~~!55N!! N#fiooo&)^#fk9BIO[ov ͌z{>ɯo>g͌"!6ů{_zW5>)D*OxG !?DM!xGyO23)#͌)=R|g}o=^͌͌roz{͉͌͌}|͉͌Þ͌Þ͌ë͉͌!!o#Ã͌zg{o͌zg{o͌zg{oolo&3:0: 0 ;!,ɯ2122=2 !"I0&q!1~\5_! ~͔D:2:/ *!"I0:/ :0:0! 0^#=ʙV¨*0!҂ :0:0& !!>O: >2 yU`:10_!~0!1s! ~͔ yU!1~N=w_! ~QZP>2 ypP͘% >U̘%>: 2 3>E͘%óf:.O*.~H:.=!4>͕%0:/#". ͆%2G:0xa{_ ʇ ʇ:0x҇_<20!/w:e/S:e/9ɯ2f/2d/2e/:0:e/ !2f/g/~#»S͉!f/~4!g/_:e/w2e/ɯ<*V0"36*"V0ɯ2!4!f/6".!f/~55!d/^4!g/~f:.:e/JGwf^l͗^{:e/&{!f/4#ww&ʞGʱ2e/xf͗ :e/&ʕ:0  ý͗&{&{ý͗  !e/~&>62/-!.6*M0"$/B".2f/*"V0͗ 2f/2e/2[020> 2͕%>20ɯ202!0~@$6^4#:[0w~$w:[00 6:[0A:[0?e@eAɷP6 o2[0:Z0ʦ:\0 :O0¦:[0':[0 !20:[0 R;/>20:Z0?:\0:O0?́;B*`0*X0++{z~ ++!+"X0:Z02Z0́ͪ'2Z0X:[0*K: ḰͪX? X́ö20Pg>ã6r>ã:[0'ƒ2[0>ã ¡:.ʔ>+2/͕%!/6 >20>20:[02́:0:Z0: 0=!EQ<!LT:[0=!LE>!GT:[0=!GE2[0" 0!04>20![0:0/ʦg¦´/ʦA¦:[0O<QA>HHR>22[0m:B_>fD> j!052!"0!0N#~#A҄0Æ7O!~*0!ʩң)Ú "0 x:[0 '¦́'æ:[0 :[0,;%:[0 !:[0; ,202́/>20:[02́:0G:0::0l:[0'́:[0' 20/:[0'|>20^—́:[0  <¨!~4 >¼!~5 : >20>V>O>I>B͘%!QéÉ $ ? H Y ` e Ò ü ò ~ÏGÇåûfD?<==:e>?; ><>; ;<=R>>>F>;>G==<==>=s;=P=*>=$?P:-?]>*<<==<;=>>y> ;: =;>?>P?<=?>>=<<i;m=>c==>o>v<=<;8?N!Nw#w#W!"V0!.w#w#l2N!.~4^!.~w!.ͼ!.ͼ!.ͼ!/~w!$/ͼ!D/~w!T/~wN#Fp+q!.~^!.!. !. !. !/!$/ !D/!T/5~wN#Fq#p>BØ%!0" * F#%2NG*V0##~w*V0##~<͉:.t!.N!. yq~t +aG=#w#wY*M0!0n& {ozg"V0!K0{#z"M0b*M0!0N#yʢ ~Õb!."O1:N *M0!$/{#z"V0$ _!.*V0~#~1 ~#"M0û1 !͒%Þ%SYMBOL TABLE OVERFLOW G*V0##~w*V0##~=*V0_###1 s#r1 ^#V1 ##"X0P wP ~O!0~z 6~=ͼ !0N#~ͼ „ Ͳ O2Ny *\ ?=)$=)w#Ž&!\60 ڱ&>GO#w ³&>O # &6 &6L#6I#6B#w2|r&\u'>2]0!"%![0~2%wG&!,x&>82%2%!"b0*"M0!1"%"&"@&#"K0"T0' _#~6' D':%A6'>:6'D'>.6'D'>-6'x&!,N'!k-x&!,N':% '> ':%'_!% '6 4ɯ2%2]02e02d02g02%:\ =)!%w#w#w#w#w#w#>2^02_0:m$(!~#$,(~(# 3(%Aʩ(Pʩ(Sʩ(Hʩ(Lʩ(*t(+t(-¶(^0~Sʣ(Mʣ(e0Lʣ(d0Qʣ(g0Rʣ(%1¶(x#3(~AҶ(#3(#6 !)-x&!x&!%͉&!%͉&ͳ'(`&͛'͠':%)!&͉&l&͛'͠'!%60#60#60#>2f0!"&:O0*!"%2%2%2%Z&%u'!-x&z{:]0ʢ)*%F)w)!"%r&\‰)*%#"%+~):.2]0ʢ)r&\!~-N'*%F))Z&!"%*%B&%)¼))*)6# )G&*%*%#"%~!<-x&G:%7*$*x*7*x2*Ϳ'5*9**&*&w#"&!F)`&!"&*&%~ʅ*B&Œ*`*G&`*!S-x&ö,͟**>&*@&w#">&!F)l&!">&*@&&`*_!%~ *2%*b0}!,~ +*#+> *>#**> **b0~>+*#2+> *> *> *}2%!%*O*:/ :O0:%y*:%!O0•+:e0!]0+~,:/ ,!/~ +:f0,:/++:_0,+:/#,:/ ,:_0=+!/~ +!0s!%~!%*4:0!/,G~Y+#x=+> Y+> Y+20!/>x6 #=,G!/~ pͳ'*&}?,>*/,`&%͈':^0*+,!&6S#6Y#6M#w!&w:%2%!"&ͳ'*2%`&%͛'͠'+,:%ʶ,:%.*P0"%.*>&}ʶ,>͕*æ,:%,l&&͈'!-x&CP/M MACRO ASSEM 2.0 NO SOURCE FILE PRESENT NO DIRECTORY SPACE SOURCE FILE NAME ERROR INVALID PARAMETER: SOURCE FILE READ ERROR OUTPUT FILE WRITE ERROR CANNOT CLOSE FILES UNBALANCED MACRO LIB END OF ASSEMBLY G:%x-!%~--.-*P0*%O {-z-.*P0"%!%^4!%w..WƐ'@'Õ*>:͕*!%^Ww*%{-|-}--{?.!%~#-6.-> ͕*> ͕*͞*> ͞*wsPATCH VERSION3.0 PATCH.COM COPYRIGHT 1982, DIGITAL RESEARCH151282@:o2! *m" -< |#}0#:] <>2   : : :3! ]~. a{ ##e~ a{ ##~ 2m#~2n*m" : aB{B @2\! :\Ҥ!e~ #Z!CO"e>M2g>2 zÖ: *e}C|O:gM>2 *e}P|R:gL>2 \2 |: @: ,?<2 L*>2 ó!>2 6 =++w: #<: +=6 ?>!6 #=D!~a_{_ w#Q: Ƃ2 * 6 : ʝʯ>2 '0: =„>2 '0:S ʂ>2 '0: =±! 3 #:! ]* } 1]:]>2 >2 A: N* | :02# }0 _'_:# 2$ !]}02$ * " * " ? <͍ <ͭ* |́* }́* |́* }́2 >:" '2" {2 z2 : 2 ܻ: WÈ* |}* |}: _:$ d:$ G* |}* |}2 : {2 x < <͍ C?C C >2% % :' YPyPtz\ V xw <͍ <:$ ڶҏکÜ:$ 2) >:$ 2) >:$ 2) >:$ =2) >2* ! :* O "+ !9 :) O F*+ ~w x <͍: > > 2}!"~"\ʽtS \ _" 2 ~ B* : #=I" 2 ^C* : #=b<* }B* | B!]>I.C!e>I<:\̹@B:C<: 0B C:" 2( :" 00B:( 0B C: 9:<!e>b  9O9$9p<!>b9f<:] ͍ͣ9<!m>I#   <9ͣ< <9͍9<:\@B:C|zʒt< <1Q ̓ͮUtͳr CP/M 3 PATCH - Version 3.0$ ERROR: $PATCH requires CP/M 3$Invalid file type: .$Serial number mismatch$No file: $False password: $Invalid patch number: $Drive $ is R/O$ on $Illegal drive: $ Enter File: $ Enter Password: $ Do you want to indicate that patch $ Valid file types: COM or PRL$ Valid patch numbers: 1-32$ Current patches for $ WARNING: Patches greater than $ exist for $ has been installed$ already exists for $ Patch $None$ for $ Patch installed$ Patch not installed$ $ $: $ COMPRL151282 @ÃCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321A͑"w*w}1ҫ!wE><0;!w!w6!w6!w"'x!%xy2w:w!)x"w*w~2w*w~og |2w:w !+x!/x!F:w_>͉:G!w>A;2wRf%!DB$![D>6;!!D;!!w>;!!-E> ;!@%*}!w;@!7Ewx͛:!8Ewx͛:"w*w:wog<,;!3x!rx*7C~og#))+"w*w#"w!HG"wbj"w!txDͺ(xx~# RE%!E>;%!F>;%@Ra%>B'!F>;%@*xx~2|x!F"w*w+:|xog!Gx͛:*w+:|xog*wx͛:R%!(DB$*w+:|xog>;!@!|x4nR%>B'@÷}x~# R%>B'!G> ;%@@%*=*w+*}x~og;@*w+*}x~og>;!9E>;!SE>;ͥ*w+*}x~og;*w+*}x~og#G>GA;*w+*}x~ogF>k}*xwÑ ̀*zw"w*w+"w*w+"w:w*w"w:w2w*w*w*w>og^<"w*7C^#V*w<*w<"w*w>og;#"w*w*w*w>og^<"w*7C^#V*w<!xE><0;!x*w>og;#"w*w*w*w>og^<"w*w*w^+++*w>og^}2w!Hg"w*w"w!HW"w*w*w<*!xͨ*w*w<"w*w+"w*w+*7C^#V<|z*w"w*w"xw!xD:w2w!x͂ :ww!xD!x͂ aÀ!xͨ!|w# À}!"w*7C^#V*w<|!xD*w"x2x:w2x:xog:xogw!F6*w:xog)))))~!Fe!HG:xog)))))6*w#"w!x4!xͨÚ!w6!"w"w"zw"|w!w6*w`~!F­!w6*7C^#V*w<2x:w2x:xog:xogog;#"w ^#V"x*vw*zw< *zw#"zw:w*~w*zw`;w*w#*x~og)))))*~w*zw`;> GA;*w *x~og)))))~*~w*zw`;w*w*x~og)))))*~w*zw`;>GA; *|w#"|w "x*x | !x/F><,;!x!8yC"~w*x)>og;"vw :w R9 %>B'!E>;%@!<,;!:ySx !w6!w6!{yD><,0;!yySu !w6{ ͔( ^#V"y*y^#V"y:y *w*y)))))~2w*w*y)))))*w:wog)))))> GA;:w!F :w *w:wog)))))6 :w *w#:wog)))))og^|n !w55r !w5*y+"y*w+"w:w *w | *w#*w^|± *w#"y!yͨ!yͨ*w*w<"w:w=2w:w !w4Ó ^#V"y>2y:zw2y:yog:yog< *~w:yog`;~c *~w:yog`;~*w*y~og))))) >2y:yog | *w*y~og))))):yog*~w:yog`;:yogx͛:ʳ !y4W *~w:yog`;6c*zw+"zw:y!y4 >I*xw"w!yL !"zw*w#"w*w"w:yog#"w*xw*w< :y<2y:w2y:yog:yog*w#"w*y4nS^#V"y*7C~og*w *y~og)))))~og<*y"y!y 2y:y:wog#>og^"w*w<:wog"w*~w:yog`;*w*w)))))*w `;>GA;*~w:yog`;~*w+*w)))))*w `;w!w6P^#V"yR;%!-DB$!E>;!*y;!!E>;!@RL%>B'@(^#V"yR%>B'*y;%!-E> ;%@%*!w;@!7Ewx͛:!8Ewx͛:>m2y:w2y:yog:yogog^|*w:yog)))))6+:F*w:yog)))))w>2y:yog |e*w:yog))))):yog6!y40!y4^#V"y!F6*w*y~og)))))"y!z"y>2z:zog |*y+:zog~g.*w *y~og)))))~g.`|!z:zogw!z4á*yGx͛:R-%>B'!G> ;%@RI%>B'!2G>;%@c%*`! z;@! z>;!9E>;!SE>;ͥ! z;>2z>2z:zog |! z:z_>͉:*y+:zog>͛:!zF><0;!z!z5!z4Ò!"w"w"w2Rz2Vz2Wz"w*w*w"Szgo"w!HW"w!Hg"w*Sz*w<!XzD2Uz:w2\z:\zog:Uzog*w#"w:Vzog*w<|!mz͜:Wzog*w<|!qz͜!*w+"w:Rz!uz!yzÙ}z~# %*w*z~og)))))*}z^#V*z~og)))))> GA;*w#"w*z4*z~og*w<|˜*z~og#>og^}*zwz~# ¡*z"z!zͨ*w*w"w*z6*w#"w%z~# *z~2z:w2z:zog:zog<\*z^#V:zog)))))6>2z:zog |U*z^#V:zog))))):zog6!z4!z4*w+"w*z~og+"w*z"z*z"z!z͜2z:w2z:zog:zog<*z^#V:zog)))))6>2z:zog |*z^#V:zog))))):zog6!z4ý!z4Ë*w*w<$*z"z!zͨ*w*w"wA!z͵"Hw͖!z͛"twåz~# I*z^#V*w;͍6!z>͓7!z͚"w!z͌!zp"w!z͘*z"z!zͤʤ!G͊= z~# ­*z^#V*w;͍6!z>͓7!z͚"w!z͌!zp"w!z͘*z"z!z!zͩ ![͊=m^#V"z!z*zr::z52z9!z5!z͛"tw!z͵"Hw*Hw|f!zF><0;!z*Hw^#V"Jw*Hw ^#V"7C*7C^#V*7C~og#;͍6!Lw>͓7*7C###"{!{A#͍6!Pw>͓7!Tw"z*7C ~gj"z*7C~!z W#:>2z:zog |l*z++:zog)w#w*z!zF:|e*7C^#V |H:z=*z+:zogwe:zog+*z++:zog)s#r!z4×^#V"{*{>l7!Lw>l785"{!{^#V"{*{>l7>5!Lw>l78>55*7C ^#V^#V"{*{>l7>5!Pw>l78>55>^#V" {*7C^#V* {^#V<&!S͊=* {^#V͍6!Pw>l779`^#V""{!${"&{!"${*"{~*&{w*${ruq!U͊=Û͇!({;!GG({x͛:ʙ>ɯB^#V^͞#V ͪͪ"  Later CP/M or MP/M Version Required$*}**}{ozg|g}o!\!l!*:3>:͞!L*3>͞K* !*ͤ͞ ͤ  >  ͤͤͤͤͤͤͤͤͤ͞ͲͲͲͤͲͲ Ͳ͞ Ͳͤ!Ͳͤ"Ͳͤ#Ͳͤ$ͻͤ%ͻͤ(ͤ1^#V#^#V́"> ́"> > ́">́{2> ́"́">́"> 2!2`iPY*}~##~#fo##^#V#{_z/!T]W{_z<KB ^#V^#V)F<*}!9{ozg| #~wþ))o |O#"9C[4BZ!9SJ~#$:> $J&9}x2LCy j2MC"){AE$:RC+-/x2LCy2MC"){Aͯ:LC!MCP& G7!9~#$&*){7<$2;C2PC2SC<2KC!9 V+iv-v>2PC#ҏ… ʉ ,v.¦#Ҧ,×eʰE+-#2QC$!LC5¡:MC!OC<_!;C>w w>+!NC~5>. G:QCx0:NC> !PC~ 5!NC4!KC5-2QCx!KC^4{# # !;C~0>0"+{*9C~2/{:PCA Ϳ"A <:/{20{>Vͬ"!0{S 5~/o :SC‰ >9ͬ"ʉ >*ͬ"w  y *:0{!9q#=€ Ï">21{<22{23{ 2.{:2{_:/{"*9C~2-{:-{9 :1{ :1{21{͟" :3{=O:1{##:3{O:.{#͖"Õ Z *A!O:1{!y21{:1{)!:.{0)!:3{O:-{*#!> #;!:1{21{:3{O:.{#͖"Õ :-{͟"!:-{"†!:-{"o!:3{O:-{##͖"Û :-{21{:3{O> #͖"Û :1{!:.{0¢!:3{O> #!:3{=O:-{##:3{O:.{#:1{21{!:3{O:.{#͖"Õ :-{V":1{":1{21{͟"":3{=O:1{##:1{ "<21{͚"Û :3{O:-{"H":1{3":-{B="?":1{*?"> #͖"Û :3{O:-{CV"D:PCi"> # #Æ":-{C}"# >R#Æ"# >B#͖"͖"Û :0{*+{!3{4!2{4S+-$G:/{Ox*9C## ¶"<>Sͬ">+ͬ">-ͬ">Cͬ">Dͬ":/,.B!2{N*9C# Ⱦ"G:2{_:/{O x*9C# Ⱦ#!i#9w$G:PC8#x+-L#SF#x+L#-SI#>+>-> F$ h#x=b#G#O# #:kCx#ډ#!ZCxO#ډ#$O#'O# £#O#> $Õ# µ#x¯#>$O# ##O#x#>O#='#$x!XC#$#:iC#$:XC> $#>29{!7{K':iC+$!XC+$> 3$> 3$3$26{!4{'!:{Ú=ê$$^$^#Vʃ$a$ͪ$F$#F|$#N|$#^#r+s#^#V++r+s~F$5F$$5^$q#pF$O$4~ $_$s#r#s#r#q!$Ú=$$C$$ Format Overflow*C-&C![{.%O:Cy+%!9G'%~#'%%y.%O:C=%Æ%͹%F%{N%*iC|w%j& *iC*XC<#<> %> %͹%> %{=>'%!9ʨ%=~#'¡%{>'%%Ì%{=>'%{>b%*XC++|2{!{'ɯ%>%>2|" |" |`i" |!9"|!{%[| ~# %*[|~n&*[|~C&!U|>;G3!!!C(!C"i|!g|͋*k&!U|>;G3!R.!!C(!C"m|!k|͋*À&*]|"o|!o|͋*!q|(*a|^#V!aCs#r*c|^#V!cCs#r*_|^#V:|*qC:|G&!u|('*_|^#V}*qC}G&!w|(':C '*_|^#V}*qC}G '!y|(':C''*_|^#V}''!{|('^#V"}|!C"|*}|"|!|͚=2|!|K'^#V"|:CZ':C'*|'*|5!|6:| ʀ'ͳ'r'a'ò'!|'*|'*|5!`C6!|':`Cʯ'*|6Ì'g,2|:|'!C"|!"|!|͚=!XC6#6!|6 :C'!|'^#V"|!TC"|*|"|!|K1%(!C"|!"|!|͚="((:C(*|~ ?(*XC#"XC(*|~ S(!XC6#6(:C(*|~ u(*\C#"\C!ZC6#6(*|~ (*ZC#"ZC!ZC#(!ZC6#6*ZC*kC#<|(!C"|!"|!|͚=('!`C6"|!9"|!|(! 9^|~# (*|^#V|)*|*| r:*| nb5)*| !|>=;O)!|>;*|:!|;*|~#{)*|^#V)))|{)*|6P#6*|~#µ)*|^#V))|)*|6#6õ)*|6<#6*|6#6*|6#6*|6#6*| 6*|^#V}4}2|*|^#V} *!|44*|^#V}"*>2|*|^#V}M**|~#M**|6#6*|"|*|"|*|"|!|(0*|^#V|Š**|"|!"|!|͚=^#V^#VOA:Cڨ*!*͚=2CO!C·*6ü* +~#w!C s#r!C4A**C** I/O Stack Overflow!9"|!|*+!9$>'+%~T]O ++~+>x^#V"|*|6͌+;,T+!C"}!" }!}͚=M,]+^,2}:}+,ͩ+:|> b€+,Æ+ͩ++>,;,+V,+D,+Ì+V,+:}+^,+,^,++D,+M,+,,é+!`C6M,+V,+D, ,:|!`Cw,+g,2|*|~!,:|*|#*|~ogw*|4:|:| :|,:| ?:|':`C‡,!TC"}! }81,! }6Ò,:`C2 }!`C6: } ڡ,*XC#"XC: } ±,!XC6#6: }"3" 3*3^#V#"3^#VͿ,,"$3,"(3|,|~Ϳ,,ya-A =.:;<>[]y *"3, -(-,$-,1J- o&))))\xH  g-#w g--"-*(3#ʖ-AҖ-G-,:ʛ- 6à-p4-+4--#,-#*½-6?-w-¬-,---#6 -..- 4-.,.#*-6?.w--,.-.#6 .%#6.*(3##^ ~?1.# *.xCON CON RDR PUN LST M!L. ~"-$.-,1ҕ.\|.l.$.!~ .-!9.,°. ʾ.-#Ý.x=GÚ.->ɯ*(3+.^#V.#{#z.6#6. r+s!}F#~*/!}6P  eA eA!}^r+s6 #6 !}4^N*(3|Z/}=G/.V/R.R/O>~f/f/>ͨ/N*(3|’/YR.=/y‹/eAÎ/>~ʞ/=ʞ/>ͨ/q2-3*(3/"*3./{..**3*(3#:-3O/.#s#r/../.è/.r+s{0!'34**3+>|0+}o͵,Ϳ,~2&3Ϳ,""3,:&3.1[.a0G:&3.1*$3p[04#63,:&3|00*3++"3Å0}+ʉ00}|23"3,0"31F<|.1##"(36*$3s#rv-š2{ ʚ2*(3:&3w060*3"3<1:&3š20<ʚ2!"3*(3(3w# 1*(3~#3*(3 B>3*$3w#w3͵,,34/Ϳ,q3͵,,3Ϳ,Nm/3*(3~" 4#4#4͵,,3~Œ11K43.>13͵,,3~.>13*(3~ʹ1>31P43*(3!*~!/2,3*(3|1(^#V,,{z1z]22'3z(2:,324/q#2Nm/#2*(3|]2*~]2=!'3Z2:,3ͨ/W2S2w:2^1>͵,,3|}3~> 3<3͵,,3|”2*$3w=3*(3$B*$3^#V6+6++<3͵,,3>3"N#F#~Ϳ,q#p#w>3͵,,3>3*~,!2=2>!*(3" s#r#w=3* 3 }!m}6 4>2l}*i}!4#4#4~#N#F#y#x#:l}*i}!!:k}ʈ3]3G3:m}~G~#~O?3#~3! p! y! q<33.3~3#!!3! 6?<04= _!x$4*4FN4wxG>O>G!$q#p#6R4"f}"i}2h}x2k}.32l}>3!h}~54m3ʘ4=4:k}4*i}<˜4G34*f}:k}O*i}:m}´4y O4:k}G3*f}w# 4N3:l}4*i}!]343*f}"f}g4:l}/g.>Gx|g}o5@5!9VzwzO#5<599! 9/GO~9O9~q+d5!96#=w5O!9Fx7yҮ5! 9~WwzO+›55_ /!9~#=557"n}>6*n}"p}56*p}"p}56*p}G!9!xb6 ]6+/6$%?'w#6-!9~R7&7~#R77! 9~.87+60D70D76 #,7+r>o&9y>o&90w+i76.7w#Ì7 O~#¢7Gxڵ77 9> 79#7!9!97>?'w#7!9͛8! 9͛89! y@88!9o>g~18Gx8f848!9!w# L898!9!9!'#s8!9^{w{W#‡8~W8~+¶8ê87>?'w# þ88!9~#88!99#8>/?'w#•9'w#¦97>?'w##´9^{w{W#9!9Ú=9999!9MD^#V# + w9ȇ :):Wf.0:r~#fo0:s#r!>O @:)8:|W}_ W:|}o|gG:yx/Wy/_{zW{_e:yw# r:~#É:~#W #ÿ:F#"r}x;:*r}!9G_>WObk++:~+:y~#//); ;=;);ɯo>g{ozg!<Ú=<<=!C{#z*aC*cC@xyx >c>_!?^#Vͺ>]>>(_>y͖>>)_>|@>R>'?|L>R>ͺ>>B>,_>]>> _eA eA eA0:_>_>m>m>]>|{>}{> ڦ>dԨ> ͨ>ڳ>ê>xm>N #~_>ü>!?ͺ>*}!9{_z>{> ?>]>>#_>*}>=^#V#͇>??>: "?>?_>!?ͺ>ͺ>>=_>^#V|W?}N?.))@ú>#F>A?> #r?~ >.?~ ?=c?^#V# File: Traceback:???????@ ERROR FIXED OVERFLOW OVERFLOW UNDERFLOW ZERO DIVIDE END OF FILE UNDEFINED FILE KEYNULCONCONRDRPUNLSTBADG!C~N@3@B Condition Stack Overflow$4Ox!t} w#s#r#s#r!9!C s#r!CN!t} +++++‡@#{ @#zʥ@++~Ç@++!C5!~# ´@ð@!CN!t} +++++@#~#@+{@#z@++~@#^#V=!C~OA5:C_!C^#V"CTC.~# !A*qC)))))C )| 6A*TC|}*D"XC:C*CTCw# \A*D{ vA zA!#"DìACopyright (c) 1980 Digital Research, v1.3 !"}"}"}2C2C*} A"}q#p##}o"}*}o|ABB+w+w+r+s4w#w#s#r<2}++*}s#r"}*}#"}*}DM!}x~¾B#~+¾B+F+Nq#p*}+"}ʹBҼB=oB!+~O~#~G!/x—ByʴB >O6# ŽB ~B=ɯ ~#fo++-B!}~#B*}$BBCBC  Insufficient Memory$ Invalid I/O List End of Execution$(CdSYSINSYSPRINT    30INITDIR WILL ACTIVATE TIME STAMPS FOR SPECIFIED DRIVE.1Do you want to re-format the directory on drive: Do you want the existing time stamps cleared0Do you want to recover time/date directory space (Y/N)? YyABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzEnd of PASS 1. ERROR: INITDIR TERMINATED. Requires CP/M 3.0 or higher. Directory already re-formatted.Not enough room in directory. Wrong password.No time stamps present. Not enough available memory. Disk is READ ONLY. Cannot find last XFCB. 3Cannot re-format the directory with RSXs in memory. Unrecognized drive.Cannot select drive.! ABCDEFGHIJKLMNOPDRIVE: Enter Drive: :Directory is password protected.Password, please. >w'xFwwww5xwwwxwwwwwwwwGwwwxxwxxwwxx>*]& :\R:]!]4,!cr+s+p+q+p+q:2 t͙ !j6 *b~*b~2j*gM#22!n6:2 :nڳ*gM#22Þ :d21= :d212m*b~2k!n6*b~2j *b~Y *bN! *`*` =2l!mM !n6!e6:m!eJ :nC !e4, P *b6= *b:kw:1.r+s#r͙ :2ʃ *.#".È !26:j2oO*` ~2f*f&*^: !o4*b:ow*f&*^:g *o&*`~2fÚ *b6*.~2g͉ :f2h!d6*.#~2g!h4N*^ :3 !n6- *h&*^:g- !n6!d4N*. ~2g*d&*.~2g*gM#22:2> !2H҆ !d4N*. ~2g*gM#22U :d21.r#+s#r*.N#22!)´ *.#".Ù   !ss+q+p+q:s=2s *p:rw*p#"p !tq!}6*'"y"{2%:%( !%6(*)&*%&!ws*)&́!xs:ts :t:tH\ *.+".s :ts :1.͵++s#r͵ !u6:w!uڙ *y"{*%M !u4{ *xM :}Ұ *7ö =7:%A ͵ *tM! ^#VT7 o7 7 7 7 7 !~q!v6:~!vD *yN*y#"y!v4% ͵ !v6:~!vڃ *{.͸p !}6^u  *{#"{!v4L ͵ !p+q*DM772͵ :y:YH 7!q:a :{ : :.O 2:͵ ͵ 7@ !6>!څ 2 4 *&@ :w: = :H  :n :[  :=2O!@ 6  :~ !4 7:8 7ã 7:8´ 7ú 7!p+q0 ͵ &7*~ *~@O:!6> !,: .*&*~ %*&*N!4 ,">͵r*++"~[+"r7͆ *DMͻ -͇ Ͱ@͠:@ ʍ:b2b\͐"*}*|27H͇ \̀"*}*|2 : ͵ Ͱ\̀"Ͱ:@ :b2b\͐"Ͱ͆ \ͻ 8̈́:2 :2HF ,">͞u+"g7*DMͻ ͵ F͆ :8‰z7Ï7:2:2 H҈!60Z:0!60Z:0:0H :0:!96!96:01:,!:61!:6:0M:H!:6M!:6:0i:d!;6i!;6:0…:Ҁ!;6Å!;6Ø!p+q*"<!\"><7"ͭ¼*<". .@l ->͵-*#".*~[ ͘-!p+q*~ *~ H'*#"*~3>>!`i^#V#~#fot2XywÉG:†xAa{m_ ʀ ʀt`i~•2F2G#~2H#~2I#~2N*| !\~=w4_P 12O'"&###~2M:G 9!!<1>27>2"> 2#!H:FH!I1>27>t2">2#2H*&.~@!"J<V<W^#V###*#*~~*&.~‡>28í.h"5~ʗ>286!:"o".~>286!N#F*#*#",^q#Vp"*#N#F*#"3^q#Vp"14!&L1 \\:8«X !86>_ 1/:~# y1p   %co %c WARNING: Cannot redirect from BIOS $ ERROR: Auxiliary device redirection not implemented $ ERROR: Insufficient Memory $ ERROR: You cannot PUT INPUT to a file when using GET or SUBMIT. $z K   %coSYSOUT $$$_ogDM!>))덑o|gҘ =†_{ozgi`N#Fogo&og~4PUT :ʜ4Y:O>52:[y<jbj%j:!F#fh!~}#$ 151282 COPYR '82 DRI ggggggggggggggggggggggggggggggggBD$H$$I! D $DA HH$@ H!@D! A ((1 üCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321 ERROR: Not renamed, $ ERROR: Drive read only.$Invalid wildcard.$ERROR: No such file to rename.$ Disk I/O.$Currently Opened.$Bad password.$file already exists$Enter password: $, delete (Y/N)?$ERROR: Invalid File. $Requires CP/M 3.0$Enter New Name: $ ERROR: Incorrect file specification. $Enter Old Name: $1 1 q"6 *6 }0*6 |H\7!" !\" " ͫ  " B ̈́ ùn7(G29 >!9 E7!6 *9 & ": )7*: DM(G29 )*: 6 *: #": *: 6=:9 : 2 #+s#r*: 6 !" !\" "  " B ʹ̈́  N o :\: ! :\o * ~2 J  . v! q* &! p+q*  ! s+p+q* : w*  * #" ~  ! p+q* ! p+q* ! p+q* ! p+q* ! q* &-! q: 2 ! 6 1! q: 2 ! 6 1! r+s+q: 2 ! 6* #s#r 1 ' '! s+q+p+q: =2 ^* : w* #" A! q: y7: 7: ¥7: ³7: 7: 7: 7: 7! p+q! 6> ! -: .'* &* >O'! 4! p+q.* * DM -E ͳ* DMͣ" * }‹* |2 : ҇* M_: >! q: aڨ: {Ҩ: : )#7  4! 6>! CO͎2 * & : w: )C: õ: ): õ: =2 O! 6 : 9: <2 h2 ! 6+6> ! ڠ* & ~?–* &* ~?ʑ77Ö! 6: <2 R: ! p+q* : w!! 6> !! *! & ~?*! &* *! &*  w:! <2! ¶ͳ z2# _:# M :# o&"$ E"& G"( I"* ", ". "0 *$ DMͤ*$ DM.2" Ÿ* DMN 47O͎Yœ* DM͓*$ DM.2" ß:" ½*$ DMN ͬ*$ DM.2" :" *$ DMN )* DM='*$ DMͳ*& E*( G** I*, *. *0 !(  Y D .*(  -< ͊2# !3 p+q7*2 DM '*" M_7D7* #" ! "  " .  -¢ !5 p+q*4 ~ *4 ~ H *4 #"4 ñ *4 ~ >>!`i^#V#~#fo"  yˆ w7 G:4 xAڈ ҈ a{ _È  . . " _og_{ozgi`N#Fog_{_z#Wè COPYRIGHT (C) 1980 DIGITAL RESEARCH @: 5@%@15252'5h+U"!""*"5j"2u3>2v3*5"3-ͩ-:5Z!""$"5"5"5"5"5" " 522>2 5:4 b:4$M:(5-C+C*M:(5!,5M[!35PMp%M(ʡͣ#v#ƒ$:5}% }!"&:5ʦ>%*#5}| V AX*|:5(#$*#5"A*#5"&#v#% RØV AR*&*R"A*5"%5!4NA#~ͫ% p"5*5N"%5!4q#͢%w 3:4(x *#5:,5o"#5V%2*5Ô; !:V :4:4{%͉"">2!:4:424*o,kÊo:4:4{,ʊ:k*%5#!(5~́ w23@:2(4y""3"323>2v3 :u3L!P46+(0>24:u3:v3"U24͋$͇%ͩ$!5*}*#5":4:4: =X!^#fk:Vj&AW y ~   8 ; C :4:4=G!4F#I ,*5͘EIr,o͉n2"5~2 r,Yo :K4 ͉:K4 " : 52> 2K4::4M:4 Mg %U!P46+:v3Ϳ$ý*3*3"3Ϳ$"3½:v3*3^#V{ʽr+s*3^#V ʽ-:v3:r+s!46#w4> 24͋$í!94~6!(5~6"3~,_#!4w͋$ÏV *3o6͋$*3~6 Þ*3:4,"3~ š62:4*3s#r2(5294*3#"%5͇%ͩ$@*3"5":(42:32(5Ģ >24*3"32(5 ͉r!Q4wM>=n2*5~2%! 5%~2͉:K4 v }>v S M:5p*#5*gu>%"u> %2 :5O%:4©:5[%! 4:4©:4,ʀ>:5: O%% 2)5:4:4 !*%5"-5>2'5*%5"&:4:4(:)5N:5N:4=N N*&"%52)ͫ%:(5ī%x;c!'54!'55:)5ž!":*5ʍ!5%Ù*5%*#5":5*%5~ *%56 ͫ%<͉:K4 "5~2o M%(>@%>#*55%!".!/5",:4M:'5M*,~#T :5T !4N*5*,s#r+"%5yP  ͫ%> ͫ%%g >v % 222:4¦ :4 – ì !ʬ ¦ À :4:4€ ( :4 :4:€ :4€ (€ € x !4À  :€ :>S %2 !~5€ :%j B !4À € !~5€ úG!~4_!p!~5^!~>À >2)5:4 *5" +"%5:4ڥ >ͫ%ͫ%[%:4 :4, V :4  + !4N#~ͫ% > ͫ%ͫ%*5"#5:)5- :)5%͉}*5" +"%5ͫ%ͫ%*5"#5>@:2(4:(5 H 23y"*5"3*%5! {#zt ~+"%5*5+"5wT #"5*5"3:)5ʑ N]T s#r+*#5* {_zW"3:)52v3 > > >2 5n2"5 %: 5*#5* 5"#5*55%"#5:5KBn2: 5O0!*", ++ *5:K4 0@:5Ĩ/ú>2) :u3ʭ :4­ *5+"%5[%2!<24*$#"$""*:40!??"4͋$"5+"%5͇%ͩ$+:4­ :4,J "*} :*5 :5%:4 +:25Ĩ/:4 :4  @S+ >2):4„ ͣ#v#: :5$:)%k %G I k :)%:)c %k %+:4„ :4, " :4 :4/ :4 :5 $*#5^#V*S"s#r*5*#5s#r+"5 |#v#*#5" 5:4 :4/ !"5:5> %AB,#*#5 :4:4 !;*M_!Q^#fkox Iͻ8ʗy0IͻGͰͻHIͻ(yIͰͻͻy0ͻIH'd ! ^#V#*"0}o|gF 9"":!`x=`y0l2!!4^4!4q/:4:4,; *5͉: 5ª|}$ªo͕Ͱ8Oͻy0H͕H͉: 5në:4:4,>C0:4M:4  ;C:4#:4 ! #! #{ozgBB**}j!]~ } #ymy>2(>2v3͖*5|EB"#5>%0,# ^#VÕJB*50MB*50!".*5} "#5^#V"5*.s#r+".*."5:u32'5!5~4P!"*|"#5>%*5%"".o!P46 !L4*>2(>2v3͖>2(>2v3͖NB:O* 0:+5ʘ0*5*!5S*5*!5S\gr!P4w#þH USE FACTOR !M4** "5A1z{*5~2*"#5v#!":5(%! 5%n25%%%>%n2G:5x:L4 o:x_*5#"5:5ʽ*5|ʉIB0>%%O%O: 5%*55%ý:5ʽ: 5O*5*5ESS͎2O=>O͎2N=#y{#* 5* 5 "#5" 5͎21͎2=HÎ2Î20:G!^4!K4wOOn2!6z_{_4A_A?*!5"#5*#5*5{z*/5+"%5**+"%5% V%=͇%͢%*%5#þ!v3ʲ:(O! ^#V4@B%GFB>%%O0*#5##~<##ò*#5"|3#"%5͇%:15^:4^!4~?^#ʲ:4͆!~3"z3^#V"#5}ʝ##~2v32w322(!~38w# ͖!~3"z3>2y3*z3^#V#"z3"#5*#5}ʩ##~<2x3G*#5###"%5:w37> ͺ!w3~w7>w> ͺ:w3Pd!5^!K4~ B!~624(02w3%!>%|_}_> ͺ!w3~w:x3ʜ=͢%ͺ!w34È*#5^#V"#5!y35:24(0!^4!K4w>R0>V0>D>P>L>O>B>S>N0!u~ڇK6N4!E s#r!U :mw* 5!] s#r!t~ ڹ6K^4!1w!;p!u~K!5N!E ~#fo!U ~2n!] ^#V"pK2oo&) ^#fkN]ivKzV{K>ɯo>g"!6ů{_zW5>)D*OxGғ !?uDM!xGyOڱò)â͝ddJ)=J|g}o=2o2o*p"rOxKxGyKxGy0KG*p*r}|K\\z{W¢Ü}|ڜâWʜllyWœâ!!#Qzg{ozg{ozg{ol&:oO:n2m*p" 52n2ox:4:4 ;!,ɯ2t2u2 52o=20!"5" 52m{!t~Q5_!1~9:uK:K4 *E"5:U2 5*]" 5*v"#5:K4 $:4§:4KK!4^#=ʣV²*4(—ҌV :4:4V !!*/O:0K>20y_j:t:_!;~:!ts!1~y_!t~X=w_!1~[Kdͪ>20$y$zU0!%2m*#5"v:mP>U0%4>%:m!>2m*202m!" 5/:0Kx*#5DM*5" 5}|^#V<>E0:u3ʛ*3~Œ:v3ʁ!\4>A!(0":3]#"3,ž"3Þ-2\  :4x_<24!K4w:94͜:94ɯ2:4284]294:4:94K)2:4;4~#!͜,!:4~*4!;4_:94w]294ɯ<*#5"W͉#4#*W"#5ɯ2[![4Y5!!:46"3!:4~q5!84^4!;4~â:u3:94†G³]âʻ^¨^·:94&·!:44#wó&G294xâG:94&:4G/G&ʷ/&ʷG/G!94~&>623y"!v36*5"3$"32:4*W"#5GJ2:42942(524> 2S(0>24ɯ242T!4~@`65!^4#:(5O:4yD(w~$w:(50 |:(5D(A:(5?ʱ@ʱD(Aɷ͙| ;!Cͻ2(5:'5:)5:5:(5ͫ%:(5 !J24:(5 ʞ;{>24:'5ʋ:)5.:5‹;Ž*-5*%5++{Iz]~ T++]!]+?"%5:'52'5hͫ%2'5ä:(5*—:S —ʤË ¤24͙ʳ>|ʾ>:(5'2(5> :u3>+2P4(0!K46 >24>24:(52SR:4Z:'5:4=!EQM<8!LE:(5=I!NE>I!LTM>!GT:(5=M!GE2(5"4!44>24!(5:4ruͳ u͇:(5D(OʓQ˜>ßH©>2T2(5:SD(B¹>D> !452T!"4!4N#~#A07O!T/!~*4! ) "4 :(5 5!'':(5 :(5,;%:(5 !:(5; ,J242Z$ l ` / ‰ >24#!:(52S:4; ¡ :4/!:Z/!)!:4 :(5'#!R:(5'z 24É :(5' >24#!^ :(5 #! #!;!)!<!!Z~4z #!>!!Z~#!5z #!:Z#!G )!Rz >24>VG!>OG!>IG!>BG!0!P!w#w#["!"#5!U3w#w#p"!u3~#4^!v3~w!3ͷ"!3ͷ"!3ͷ"!3~w!3ͷ"!4~w!(4~wN#Fp+q!u3~#^!v3"!3#!3#!3#!3"!3#!4"!(4"5~wN#Fq#p>B0!4"%*%F# #2P"*#5##~G=#w#6#w]$*5!4n& {ozg"#5!5{#z$"5f$*5!4N#yʦ$ ~Ù$f$!U3"Q"/$:P"%*5!3{#z"#5%_!U3*#5~#~&%~#$"5ÿ$&%!%*A1SYMBOL TABLE OVERFLOW *#5###w*#5###~,#*#5_####&%s#r&%^#V&%##"%5F%wF%~#!4~l%6~=ͫ%ͫ%!4N#~ͫ% y%͢%͢%2P"*ÿ*:?*ÿ*:@*ÿ*~x/~# *> x/\ ?-$-w#+!\64 #+>GO#w %+>O # <+6 2+6L#6I#6B#w2|*\+>2*5!"B*!(5~2A*w͹*!1*>826*27*!"/5*"5!5"h*"*"*#"5"!5\, _#~ͨ+ ¶+:;*Aͨ+>:ͨ+Ͷ+>.ͨ+Ͷ+>-ͨ+*!1+!32*!1+:=* D,> D,:D*6,_!D* W,6 4ɯ2D*2*522521528*:\ -2;*2@*O:\ʋ,=Ì,y!<*w#w#w#w#>2+52,5:m$>-!~#$ª,~>-# ʱ,<*A-P-S-R-L-*,+,-,-+5~S-M-25L-15Q-8*1,-x#ñ,~A,-#ñ,#6 !1*!*!E**e !N*+-!j**%,r-6* ,,:=*ʂ-:>*…-2:?*ʨ-!***ѯ2:*29* ,,!3*60#60#60#>235!"*:5ͨ/-!"f*2Q*2e**E*+!1*z{:*5G.*B*-.!"B**\..*B*#"B*+~¤.:u32*5G.*\!F2+*f*-•.*!"f**h*ʹ*E*€.a.Ò.Ҫ.ʒ.6# ‹.͹**h**f*#"f*~!2*G:=*..xx/.x.1,..****w#"*!-*!"***j*!*-/~5/ʹ*9//͹*!2*1L/****w#"*!-*!"****/_!5*~ ͳ.27**/5}!1~ /ͳ.#/> ͳ.>#ͳ.ͅ/> ͳ.*/5~/ͳ.#/> ͳ.> ͳ.> ó.}26*!7*è/Oͳ.:K4 :5:=*yx/:8*!5I0:25!*5—0~0:K4 0!K4~ —0:350:P4+—0:,50ʗ0:Q4#0:L4 0:,5=ʗ0!K4~ ʇ0!4s!7*~!6*Ԩ/4:4!K4ʺ0G~ 0#x=ë0> 0> 024!K4>x6 #=0G!K4~ p%,**}0>ͳ.0*j*+:+5ʨ/0!s*6S#6Y#6M#w!*w:>*2=*!"*%,ʨ/26**j*կ ,,0:?*1::*Z1ͬ2L1͎2**}1}w1>B/a1}|Gd/:?*ʓ1**+![2*CP/M RMAC ASSEM 1.1 NO SOURCE FILE PRESENT NO DIRECTORY SPACE SOURCE FILE NAME ERROR INVALID PARAMETER: SOURCE FILE READ ERROR OUTPUT FILE WRITE ERROR CANNOT CLOSE FILES UNBALANCED MACRO LIB END OF ASSEMBLY : 5O!5 ~#fo: 5O!5 s#r:?*yʟ2š2ͬ2Ž2G:9*29*!:*4>6:9*L/29*2%#333/3 3333#332E3 3   MXList WAITING FOR PRINTER $PRINTER READY $ɀSAVE SAVE y<1!~ʋ;:* ͩ".~>2`*.h~`>26!*#~2#~2r+s-* 1!~ʀ#_6|ʉ#6?#6 #6$\<8Y‰\>!|w\:V"8: V "**Ͳ\h}}€!*:2\<T}Q**#s#r>2:Ÿ*.h6 1>2::>2}2|2!"  !!\( yŽw=G::xAڎҎa{!_Î 4 4(!~> L5*~#"a_:f7ñ8 ʱ0vñ@7ñ҇0ÒGڐ7ñ7o:O& ʦ))))ÛzW{_f: CP/M 3 SAVE - Version 3.0$ Enter file (type RETURN to exit): $ Delete $ Beginning hex address $ Ending hex address $ $ ERROR: Bad close.$ ERROR: No directory space.$ ERROR: No disk space.$@$ $H I$I!$HI"$$"$ I ! A  !B B@@ $ABH$!"D$"Bɀ"#DIRLBL 1!M CP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321!`i^#V#~#foͽ{¡y#wG:xA##6?)@w){#{s333333.;;33,;;#wD{_#6 sO O ڹ.:;=,/[]<>a{Ҷ_#  ý Copyright (c) 1982 Digital Research File not found or no directory spaceInvalid file name.Directory Label attribute set Read Only (RO)Read Write (RW), set to ERROR: READWRITEDELETENONE on off LABEL @ @Option requires a file referenceOption only for drives.Assign passwords to input files.Assign a password to this file.Directory needs to be re-formatted for time/date stamps. Please see INITDIR.Protection not enabled for disk.Unrecognized option.There are no modifiers for this option.Modifier missing or unrecognizable.Not a valid modifier for this option.This option needs a modifier.Only first 8 characters of default password used.Only first 11 characters of label name used.Only first 8 characters of password used.Cannot have both create and access time stamps.Cannot set both sys and dir.Cannot set RO and RW.No options specified.Page and nopage option selected. Nopage in effect.Cannot set local options for file.Protection modifier is only ON/OFF for drives.Password protection is not supported in NON-BANKED SYS.Requires CP/M 3 or higher.ACCESS0ARCHIVE0CREATE0DEFAULT0DIR0F10F20F30F40NAME0PASSWORD0PROTECT0RO0RW0SYS0UPDATE0PAGE0NOPAGE"%(+.3%\|"()/#!@&+-*??Directory Passwds Stamp Stamp Stamp Label Reqd Create Access Update -------------- ------- ------- ------- ------- Press RETURN to continue. ?Password ? Disk I/ODrive Invalid Drive.Wrong Password? in filespec.?ONOFFsystem (SYS)directory (DIR), Drive Default password = Password = Label for drive Protection = or protection not enabled for disk.Modifier: Option: FILE: 1!1!1 ""*"}2W#|2X#̀ 2"!"6:W#0w n ͎ 2!ͽ l 2"*U#& ~ œ !U#4Æ *U#& ""*U#& ~[ *"#""B!:" o ! !!6 S :" *"""B Q͟ 9 :"!"" g͟ !!6= :"1 !!6= :"= !!6]B |M !"6 :"k *"""!"6o P &͟ v!!q*!& y !!p+q*!~ʯ *!Ny *!#"!Õ   y  y ͹ :! !"4~<<+~H ͹ ͹ 0 ͏ Ͱ  2!:! !"6͹ ͹ !!p+q *!DM͏  !!q*!&!!p+q*!!!p+q*! !!q*!&-!!p+q"u *!"!!!p+q"u *!d!!q*!&e!!p+q"u *!f!!p+q"u *!g!!q*!&) ^#V%!!p+q*!! #q: #2"!"6"1!#r+s+q:#2"!"6*##s#r"1!"6#6"1x >"9!® *"DM͏ ö *"DM͏ J ͏  "̀"##1! ͑ >#9!*#~[ !"6 *#~] !"6*##"#!"6*#!#s+q+p+q:#=2#J*#:#w*##"#-!#s+p+q+p+q:#=2#ʁ*#*# w*##"#*##"#Z: 2#aڛ:#{қ:# :#!#p+qx *#DM͏ M  " !#6>!#?͂2 # *#&" : #w: # ?: #ý: #-:#ý:#=2#O!" 6 : #8 !#4Ͱ 2 #:"AOy :y F!!#6> !!#ڋ:!# s.y *!#&*!>Oy !!#4]x *"|2"#x F͉ :"#¸Y ͏ :"#b ͏ M͏ :"#M͏ :"#i ͏ :"#x ͏ :"#  ͏ !##q&"u  S 2##!$#q:$#>:$#o&&""!:\w!"6!"6&"u *#EZ *#GZ *#IZ *#Z * #Z * #Z "*#DMKc 2%#¡>*%#M>!'#q=͏ :'# ͏  ͏ p͏  Z ͏  ͏  ͏  ZM͏ W͏ ]͏  y  Z!Ay Z/1y Z=2y ZK3y ZY4y !(#q*(#&*!~q>>:"ڒ:"ڒ&"u \S O!)#q:)# ¨ͅ 2*#ò*"M 2*#:*#  F͉ p͏ :)# M͏ W͏ ]͏ :"*"M 2+#!"6>!+#Ia:,#o&&""! >w*! ~ F*! ~F!"6[!\"!]K!"6&"u S 2,#:,#ʗ:,#`O!&" ~ Žc 2,#p U͉ ͉ :"!"6*! !K!"6+6! ""}*"|͌͘͟:!2"!"6:" ͟" *"*""K"j  ! "6"͏ :"b:"Tͥ͟:"2"p *! >w " :"‰!"6!"6*"*" "K:"ҥ:"Ҹ͟!"6*!#  >!"3!-#6:"=!-#"*-#&*"~.*"*!#DM*-#K:-#"!# *! DMK!-#4*"*!#DM*"K!0#s+q+q:"G:"Z!"6͟*.#&" ~z *! :/#wÆ *! :0#w:"ͥ:"21#¤!"6:1#´!"6@:1#!"6 !"6 " :":"2"!:"͟:"21#O>͟ 4*!  !3#s+q:"0:"C!"6͟*2#&" ~b*3#&*!>wp*3#&*!>w!"6 ͏ !"6 "͏   F  U *! >µ͏ û͏  *! >@@25#*! >͏ ͏ :5#͏ ͏  *! > ͏ ͏  *! ~1 v ͏ :"K͏ Ô:"@@^͏ Ô:" q͏ Ô:"/: " HҎ͏ Ô͏ :"Ҥm͏ v!6#q*"|. :6#͘, ͷ:" :6#*!DMͧ "" :6#*!DM "" ! ""*"|.͌:6#(, +͘>>*!DMͧ ""*"}t*"|kͥX*"|h͌͘t͘͟*"}ʘ *! *! ~ژ͘*!DM ""*"}*"|ͥ*"|͌, J͈͟>!"(:"(:"(:" :" ͟"*͘͟!"6:"?:"?:"2":"2!! ""*"}Š*"|}ͥj*"|z͌͘Ê͟  :"¦:!2!!2 o&""͘2:!:!=2"*"MC ͽ !7#6> !7#*7#&\ ~?>!7#4>ͭ! \K!"K:] :e HY!"6&"u \S 28#O!\"!͘͟ *8#M^!"6!:#s+q*9#&)))A *:#& ~!;#q!<#6*<#&u :s—>*<#&u :;#«:<#!<#4Ä!@#r+s+p+q!G#6:H#:H#2G#*D#M{2"!L#6:"=:L# *D#M{2":A#2"}>:A#2"2K#:H#2I#!L#6:H#2G#:H#Dß*H#& *?#*H#&*?#=2J#!K#–!L#6!B#6:K#!B#ړ=:L#ڌ0!B#4uÙ0}>:""!+s#r:"*"#"":2":I#:G#2M#O*?# ~2C#*C#&*=#:s!M#4~2H#*C#&*=#:D#*M#&*?#~2C#!H#6*"~2D#:C#2E#!A#6*"#~2D#!E#4N*=# :tW!L#6m*E#&*=#:D#m!L#6!A#4N*" ~2D#*A#&*"~2D#*D#M{2":":"H:"H:"H!A#4N*" ~2D#*D#M{2"Õ:A#2""!#+s#r*"N{2"!*"#"":""9!+"O#!N#6:"!N#A*O#Ny *O##"O#!N#4"!"6!"6!"6:"Z!:"e!:"p:ͳ2"„"!:":"#H!:":"=o&)))A ~ھ+:"=o&)))A  ~ lNͳ2"4:"=o&)))A *"& ~=*"""!"6#6!Q#6:"=*"N{2"*"#""!Q#4!:"X*"N{2"*"#""!Q#5>:"=Œ*""":Q#2"O>҉e͟!"6:"= ¶*""":Q#2"O> ҳ!"6 ͟*""":Q#2"O>͟!"6:":"=o&)))A ~HF:"=O!" 6>!":"=:"=O!" HqQ͟X͟X͟O!͟OG͟X/  ^:  Q:"s ":"ҁ":"ҏ":"ҝ":"ҫ":"ҵ͝:"ҿ?:"͇:":"!":"!":"͟͟ P:"):"!"64@4:"P:"F!"6@44:"!"t:"h͟͟ Ø:"҅ "Ø:"Ҙ!"6 ":"ҩ 4:"!";͟  :":"!"6  " ͓ :" :" !"6  "  ͓EB "#GB "#IB "#B "#B " #B " #2"O ! "K!T#p+q*S#""""!!"" ""*"DMS :"Ҙ ͟!!6C  !͏ >"9!ʬ !"6ñ !"6!\K9 :"!:"  e͗ :" ͙ :" 1:" ͗ :"!!"6!?!!"6 _ogi`N#Fogo&ogDIRLBL yd'* !9"1"#2#:Og}**Ip2~w2i#1#":RͶ :O~!ʫ:<2Ž:"2"x2*# O:ļ:<:G>O*# :<t tIw!/>!/>!*6 #:_#:*Y" Y" Y" "*Y"#####Y"##Y"Y"Yz2*Kg"ɯ22!"*DM6:O* 2~ ~ †:<~:2>2:<** "_?:<2>!/:<}:2* ~b W6 y2> # vwm>2>!/ N *~O²+—">2>!/*:< "~G # p *~w#  : *8*:*8yO:O*}O= ~ w#P^#V#ɷ{ozg |g}oh:<͉̉O<OBKBK$'-*!*DD  $$HD@" @@ $B $$H$H$HH$$! HD$D$D@AD HD$!A" ÀCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH251082654321!9"k1G \!m!w# š!v6H#6E#6X!e6C#6O#6M<<&:g.".g"?S:2n!`w #4o"c*e{ozg"hj:]@*c"\y!5C*^N{zb+"^*^*`*h"!j4&"h"y:b<5*kG!gwxS0  *cN,*cN{zҽ{,*c*e{ozg ~*c#"c> :[ >  X N*c>:> !:q#G*eDM*h ERROR: $DISK READ$LOAD ADDRESS LESS THAN 100$DISK WRITE$LOAD ADDRESS $ERROR ADDRESS $INVALID HEX DIGIT$CHECKSUM ERROR $FIRST ADDRESS $LAST ADDRESS $BYTES READ $RECORDS WRITTEN $CANNOT OPEN SOURCE FILE$DIRECTORY FULL$CANNOT CLOSE FILE$HEXCOM VERS: 3.00 $1CP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321TEMPORARY~ORDER~PAGE~DISPLAY~NO~COM~SUB~NOPAGE~NODISPLAY~ON~OFF  $(/9!6#6#6#6#6!"+~2*& "*& ~[”*#" â' :¢ V v!q*&!p+q*  !q:2!61!s+q:2!6*&"1!q!6*& ->*& :A:!4!r+s+p+q+p+q!6*~ʯ*~2*M2!6:¦:ڙé*M2Äùe:2#:22*~2!6*~2*~?*N! ** =2!3!6!6:!0:)!46*6#*:w:+s#r:i*#"n!6:2O* ~2*&*:ʿ!4*:w*&*:®*&*~2À*6*~2o:2!6*#~2!4N* :!6*&*:!6!4N* ~2*&*~2*M2:> !Hl!4N* ~2*M2;:2#+s#r*N2!š*#" ͯ ͯ!q!6*""2:(!6(*&*&!s*&!s::H*+":++s#r͛!6:!D*"*M!4&*M:[Ϳa2Ϳ:Al͛*M! ^#VIͿiͿ{ͿͿͿͿͿͿ Ϳ|͛!q!6:! *Nͯ*#"!4͛!6:!R *? !6^ͯD  ͯ*#"!4 ͛L2M2N2O2P2,22:2:2:W ͛Ϳ!6*& ~:HW :1Oͯ*M! ^#V1Ϳ 4Ϳ 7Ϳ :Ϳ =Ϳ*& ~8 RͿM *& >@Oͯ:ͯ͛!4ø :Ҙ ͛ZͿ*M! ^#VrͿØ vͿØ ͿØ w : ͛Ϳ>!Ҷ !6: Ϳ :@Oͯ:ͯ: ͛Ϳ: Ϳ Ϳ:# ͛Ϳ: Ϳ# Ϳ͛!6!6!6!6>!V *& 6!4; !6:: H I>!Ҏ ͦ:› ͦ!6>! *& :=¿ ͦ!4  :=*& w!4[ !6>! :L*& ^O!4 :: Hұ!6!6I*M! ^#Vͦî!6:] ͦI:w ͦ:=_Pî!6!6#6:ʞ ͦ*~ ~ Hҿ *#"Þ *~( !6*#"I::H ͦ: !6:2: :/H!0 ͦ: !҇ I::Hj ͦ:2:!҇ ͦ2:¢ :2ê :2:½ :2 :2*: : ͦ *#" : ͦ*~]~H!6 î!6!6:WI: W: R!6Wͦ*,*-î!6!6:¨I: ʨ: £!6èͦ2::2:2*îI::Hͦ:!6,-<!62:2*îͦîͦî!6,-î!62:2*îͦîͦîC K l?GOe !p+q*~ ~ H*#"ø*~>>_ogDM!>))덑o|g =o&og~1}CP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321 Copyright (c) 1982, Digital Research 10/27/82Show 3.1ERROR: INPUT: OPTION: DRIVE: Unrecognized Option.Unrecognized drive.Requires CP/M 3 or higher.No directory label exists on drive Unrecognized input.A:0B:0C:0D:0E:0F:0G:0H:0I:0J:0K:0L:0M:0N:0O:0P:SPACE0DIRECTORY0DRIVES0LABEL0USERS0PAGE0NOPAGE !$'*-/#(.[]=, :;<>%\|"()/#!@&+-*?;Zx0NSun$Mon$Tue$Wed$Thu$Fri$Sat$?????????????Directory Passwds Stamp StampLabel Reqd Update Label Created Label Updated------------ ------- ------ ------ -------------- --------------Press RETURN to continue.: Drive Characteristics128 Byte Record CapacityKilobyte Drive Capacity32 Byte Directory EntriesChecked Directory EntriesRecords / Directory EntryRecords / BlockSectors / TrackReserved TracksBytes / Physical Record, Space: Number of time/date directory entries: Number of free directory entries: Active User : Active Files: # of files : Label for drive AccessCreate on off on on off on off 1}1}{o&" >0 ͑*!& ~ :!<2!*!& " 2 h2 !!6>!!Y*!& 6:!<2!;6f!$ 6(2! 6D~!% 6ͱ!!6>!!*!& ~2 ʺ*!& N*!Mz:!<2!†v! q* & ! p+q* ~* N* #"     :$ e! 4~<<+~He  MC]! 6  ! p+q * DM }! q* &:~ҝ:}¦:}`O! : ½2}Õ! p+q* ~?2~* 2}͕2}͕! p+q* !Z 6Z 1!Z 6,Z 1!Z 6]Z 1|"  ! q* &.! q* &e! p+qi* DM! q: <2 O* : w! p+q* ~$* : <2 O* w* #" ! q: 0Oͦ! q: O: O! q* M:ͦ! q* &! ͆K* &! ͆M! q* M& /ͦ: e : s ! 6: <2 O* ~2 : ” \ Æ : 0 ! s+q! 6͆ ͕ ڶ ͕  : : : H2  : 0! w \ ö ! : #~! H : ! s+q+q͆ ! : 4 \ * M* ͞ ! s+q: 2 : * &) >;H{ : =: ! q* &! ͆))))* &͈ } ͞ =2 : 2! !!6 * & ~2!/*! 2 /cN 2 : !!: H * &) : N_!mͥq* & NC * M* C _* #q#p͞ O * w:; O * w* ~¬ : :  :; 2!* 6 :; O * w!!s+q:!!!! 6N!m"!:  !n"!!  ! +s#r! 4 ! 6 >! P : =2 2 ! !6* &) : !m! M  * ~2!*  ~2!*  ~2!* #^#V" +!͆! !s ! !6: >;! HҮ ! !6 * &) : !m ! s+4* ~ : !O! DMͽ ͦ* MK * MK * M&  ͦ*!M *!M * ~& *!M! !p+q!" !* !"  " * ~~He Q ! 6 Þ * ~~Hқ ! 6* ~2 ͢ * &* " !Þ !-!p+q!!6.*,!DM! -¶ !' !.!6> !.! *.!& ! N:.!<2.! \* ##N!ͥ"/!!1!q:1!2 Oͅ !3!p+q!2!* >2!y#M͹!7!s+q+p+q:7!=27!f*4!:6!w*4!#"4!I!!s+p+q+p+q>!*!*!͆!!s*!*!͆"!*!! ͆"!>!º:!:!!!6:!0Ov!!p+q!'"!!!6>!8*!*!͆:!=2!O!8! s*!*!͆"!*!! ͆"!!!6#6:!=2!}*!&8! ~0O~:!:!Hz,~A!!q*!&8! ~¤:!Ҥ:!ʤ*!M!!6!!r+s+p+q!!6#6>!!0*!&*!*!&*!~!!#N*! w*!&*!^! ͆!!s#N*! ^! ͆*!&*!q:!<2!!!p+q8!<?!<*!N#F*!##~2!!!6>!!ڙ:!҇*!&w!) N#F?!ͱ:!2!:!<2!d8!?!ͱ9!!p+q*!##~2!*!##~*!##w*!*!q#p*!#:!*!#w!!p+q*!#* ##N͹* *!##* ##NH*!##w*!* ##N*!q#p: AO !!r+s+p+q*!/!a*!q#p*!ڒ*!*!q#p*!N#F*!q#pc!!q!"!"!!!6!"!* !:!*!DM2!:!/!!H*!"!ҫ*!!"! i8*!##6* N#F*!q#p,ͦE* N#F^ * ^#V))DMy* ~* N!!+s#r*!DM  1:!!p+q*!##6*!*!s#r!!p+q!'"!!!6>!ʚ*!*!͆{2!*!*!͆"!*!! ͆"!>!!!+~Hҗ!!6:!0O5>0 ҹ" ͓DM$* Mqͦ1k!!p+q 8R*!}OW͛: : 2!"!S"!!!6>!ʈ*!}g: /X!!:!U*!DMg*!M*!DM!!+s#r!!+s#r#~!X *X g 8)*V g !!6>!! *!&& 6*!&6 ) >w#6:!<2!!"X 5!"!:}:}2!*!& ~2!:!!*!& "!*!##"!*!#"!:!2!:!2!O!& 6>!!Ґ*!* ~Ҥ*!~*!&6 ) N#F*!&6 ) q#p*X #"X %* & 6>!X * N#F`i"X * N#FPY*X *!"V 8QhOg 8`* & ~/\!!6>!!ڐ*!&& ~҆*!&g:!<2!a 8o!!6>!!*!&& ~*!&6 ) N#Fg:!<2!¡͘* & ~/͘!!qD>!! :}0:}`O! ~ * * Ḿ2!>!!/:}o&"!~i8 Eiji:!@@†Ìi B:% /:!րHҽ:!@@:!:! *! DM͟ *! DM͟ >͑: AO !!6> !!x:! ].*!&*!>O:!<2!G!!q!!6*!& :•>*!& :!©:!:!<2!Â!!r+s+p+q)!!6?:!:!2!*!My2 !!6: ]:!/ *!My2 ?:!2 ͩ:!:!2 : 2!:!2!!!6:!2!?:!Jñ*!& *!*!&*!=2!!!:!£!!6!!6:!!!ڠ]:!/Җ6:!<2!~æ6!!6ͩ>:!2!:  l+s#r): * #" :2 :!:!2!*!&*!~2!*!&*!:9:!<2!:!2!*!&*!:!(*!&*!~2!!!6* ~2!:!2!!!6* #~2!:!<2!*!&*!:}!!6Ó*!&*!:!ʓ!!6:!<2!*!&* ~2!*!&* ~2!*!My2 : : H: H: H:!<2!*!&* ~2!*!My2 :!2 :  l#+s#r* Ny2 !D* #" ):  +"!!!6: !!y*!N*!#"!:!<2!W!!q*!&ͥ^ *V& ~ʞ*!&ͥ^ *U& ~ʾ1*!&ͥ^ *T& ~*!&ͥ^ *W& ~#*!&ͥ^ *S& ~: :: 2 * & : w* #" * Ny2 : ZÔ!: q!: qÔ* &ͥ^ *V& 6* #" >* &ͥ^ *V& ~* &ͥ^ *V& 6ʹ2 !X: !$ 6!Y: !$ 6* &ͥ^ : =O 6-͑iE!: :>!: G>Zʹ2!_Þ:!=2 * & : w* &ͥ^ *V& 6!: ʝ* +" ͑iE! 6* Ny2 !* &ͥ^ *V& 6! 6!: ;2 -: K-!: !!: !L! 6* #" !: K* Ny2 !K?͑iEi`N#Fog_og_ogDM!>))덑o|gҟ =DM!>))Ҵ =¬~ º~ ^#V) ^#V|g}o _{ozgO{ozgi`N#Fogo&og_{_z#W  F!M!T![!b!i!p!yÙCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282@CP/M 3 SID - Version 3.0$1 !~=W!x ~#ôbx {~#o}o.ÃO$ y͏ , $  ͌ 9!z6 # L!zw͌j# X:z 0 ͘=N#Fy}80*z{¯#z+++ ¥ z#½# · 9!`͠ y9!rͷ y=!z{w# % w!P͠ y͓}*w#"͌ @.@<!Eͷ~P !ͷ’P͌Q!ͷªP}QxQ!ͷ͓G@Q! ͷ y͓Gþ!ͷ ͓Q!ͷ͓Q͌Q!.ͷ6y#G͙Qà!2ͷQ͓͌Q!>ͷq eg͙Q:zJEËC–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON# z8O!B N#N ¾SP.* |} !9":q!"28!"9:] ,:e &͟:l &:u &ͮ!I 1lĤ>#J ,!6-X5AڔҔ_!o^#V - G  + Q  1ͳҔ~½:,=”͍" ,~ڔʔ͍=͍=͍!,o͍ "c=͍=”)*c)!"f,*f*c"h ,*cL>::ʗ^#V#L cxZy y~ #*f ڵ™y ¶"c:,*hT*f , ,T:e,>2e,:ʔ%:e  ͟:u ' ͮ!I Y|”,,}5 2l~2m͍͍"n͍"pDMs !l6ʏ } "v=ʏ =ʏ YP !~ #^#V:l *v{ z "r~62t #w6 ” 1l*v*t!~4 #~#F# x ~#s#r#w>~ʽ ͍=; =”͍Lᯕo>gL,>#!u^#V#0}o|ge X x| y0ʃ GÏ yÏ  G| Q z,{ ,<,>'{>',*##V+^+N+y,L ~+ , :”%,ͳ~ ͍" = ͍"=”" > 2,Y,!|G }G , w#. ~ڔ ͍!=:r ”͍| !| !|”"!~ʩ #~#V§ z§ :w, ‰ :ʔ!~ :w#s#r, ¾ Ô!~ : 6 ~#^#V ,:ʔ!\6#>  w# ' >w# 1 6~!I =”*"!l6~# T :]?2 7ʔ!">HXE͆*ʾ \ͤ2 w# ™ ͥ͝* ҆ !""Ô\ʔ:¾ W$ _$ $ O { x! i`"v2 $ $ w# $ ͥ͝”þ \̀\̀ GтWx!͓B :>ULT͆!6\~# S 2|:] !7<ʔ\ !t   _*\ ʣ \ w Ø *+\ !ڔw{Ҕè *#^#Vr+s+6͓Ҕ*"s#s#rt ! *v*",!*L*L*vL*+L,o=”͍L:X^#VL\~J ʯ.y:,>."Ž! ;w#́=”͍:ʨs#r#;”}w#:;#;>>2o!"#͍}ʔ==”͍""2mNl :ʔ!\>2|!"*"~:8”*"*"*͠ڔ!"\zn<ʔ*ͯ~# _\V”*#"͠:W\J!*L!,:2:2>2::>2 N, !9# Ô ”J~,=”͍xA|”}ҔgA>;Ag};,;Q|”}!qw,s#r,:[|_!~ʐ![4Ð\ͤŽ2[g>>?,!e>Cw#>Ow#>Mw!u>Sw#>Yw#>Mw., * ͽw#  ͽ  * ?r# {zPY! |}>2!""!Ow #w 0q!\6 ͤ!"~”͍͍͍!6W6!6# ,œ>2ß͓ͣ ͓ͣ ͓ͣ ”ʔ   :@w# G6#. 6# x!a_!~> 55*~#"ů2[\ͤͤͤͤͤͤ!ex#y#*}|͓"*}|":!͓> _ͤ~# 07> >  ͤL:8>.^+~+:8*>:|}^ >.*f}o|/+- , 0 Ô^#V#*NyҔ** n +ñ q#^#V""~/o>g++Û!.ʔ@͔^#V= ͔^'D! ڔ'?!q'”S_&#hqf0 Ҕ)DM)) O I^*r^#V#^q̀))))oqh"s#r#!4-®+»*+ þ-y_xWþ!IXN!p~ !D_^!x^#Vx1>-~~>=G!q~L!9#x sYYͳғ*v" !6û+"f*v~#cڻʷ^#Vû~*v~Gx5@xv5 x805 x6 45>=*t~*t$5x*l$*n:585"CZMEIABDHSP!"2"t+"v!91t*v~:t2l!~ʐ#^#V#~ ƒ!~6ʳ=G#^#V#~xâ#"v!N#FN*>7l :|!~9#~#V*v9z9~==2wͲ:l <!*vNl  |Ͳd=Xl *v5Nl :l|*pMD*n:m7l !"N2>**vͳҟ" *t"c, PASS !~*+"|w=2~ !~##Z:t*rw2t*vF#!s! ^#V&N&N,`r<¦Gæ::^#V#2*r^#V<[>èæxjê8_æ*t2¦,:?*v###æG>è><7*|!N*v!>#> :!>=_~/w/w{G=YP"*##F+N+~a/o>g{\z\<33=>!y$ڇ *y$&>'d !y$4d SYMBOLS NEXT MSZE PC END 6!z$q!h#6?! h record(s) written. h#H!:#A{$O !:h# !2h#!@ !:h#S:h#QHP!:#<2|$2h#:h# HG!)!2h#Ô!2h#02|$O> j!!|$6Ô!2h#02w$O> @!!BH @@ABH B! "BHI$$BI$BI $ HI D$HD$$ H B!$D$"$B$DA!ABI$H B$I $HI$H$! $I $I$I $I $BBHHA"HI$H!$HH$ IDH$$H$"BD $$$HH$B@@D!@H" H " "BI$DI$I $H @HI"$AD@@HA$ $@ $@D IB!  $H $I$$HD H!"A""! I$DDI"I$ @$I"DH BH" !I B  B$H$@"IHBI $$@H@ @@@D !@BA$!" D!$A$B@$@@$"$"@  D@@"DH $I!"DH$BB$"H@ $!D$$I$I$$"A$$I  D UUTH@@!@H@ !$  ASUB 1xCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321Invalid file name $Error On Line $Enter Password: $ERROR: No 'SUB' File Found$CP/M 3 SUBMIT Version 3.0 $Enter File to SUBMIT: $SUBDisk Write Error$Random Read $.$Invalid ASCII Character$Parameter Error$ERROR: Directory Full$Requires CP/M 3.0 $11G"*}0|HҤbP2IK 1">d*++"~"!\. v!q*&!p+q* !s+p+q*:w#6* *#"N#Fy !p+q*!p+q*2 !p+q*!p+q*!p+q*!p+q*!!p+q*2 !p+q*!q*-!q:2!61!s+q:2!6*&"1!p+q*<!s+p+q+p+q:=2d** w*#"*#"=  !s+q+p+q:=2ʩ*:w*#"Ì!p+qe*DM!\.\s!q:a:{: :O2:eel !6>!ڜ2 K*&l :w: T:_:…:r:=2O!l 6 3:•!4**& ~ ~ H!4Ýl :S*Q*Sl.l\P"*}=*|&el\P"=*|5.*& 6!6͝*& ~( 2*& 6e!"!\" "\p.e.:\2O>:2\*& ~ ~H~ H.!4͝*& ~2!6>!`\̓[>!6:<2=O! ~2 ½:<2O>9ҽ!60+~9ҽ!60+~9ҽ!60+~9ҽ!60+4:͓ͪ!"!6:= !6!6#6D2: H% : " :#$ͪ:;!6+~<;!6:$¨D2$X*M å:02O> p<ͪå!6͝:ʔ!5K ҎÄ͝xK ҥ*M Ô" :^D2:^^ :@: O :`:@O :`O " :!:/H     " *M : 2    *++" *& ~2 :Ht !4>>!""\ !6>!ڷ :+ ~° !4‘ * DM*"À * DM!" }2 ͣ2 :  ͪõ!q!r- "w * :w:C w *#" "*#~22_! 8!0!s*&:0!s!6ͳ:  sͳ:  L!`i^#V#~#fo yo w G: xAo o a{ _o     `i~< #~2#~2#~2*| W \!\~R 2 .n~ >2 6!.t~: +  >2 6!N#F#*" ^q#Vp" N#F##"^q#Vp" 4! 7o |  ! 6   \\ ? >_ 1m :~# yo ɍWARNING: Cannot redirect from BIOS $ERROR: Auxiliary device redirection not implemented $ERROR: Insufficient Memory $""SYSIN SUB_ogDM!>))덑o|gQ =?i`N#Fogo&og_{_z#W00001 : $SYSIN $$$FGET :<***.n6.t6 LL!p:~y !6 <ʊ~"x!=F#fh!:~!«!>w~:!5*.~w:; :~!9"1A#u.t.~@w :&/3͖!~6 :~wucy! ʎB d{<ʑ  '*2.2+6.w 22*2$*.6#6*.~w#~=~#4Ʌo$͖O̓!54  !F6#ȷxO҃>^̓@_: N#͖§>  *.>wÔ#wt~xڔp> ̓ 8>""SYSIN SUB hhhhhhhhhhhhhhWARNING: PROGRAM INPUT IGNORED $ 151282 COPYR '82 DRI gggggggggggggggggggggggggggggg"D! BH!H@ $!!$"A! D$DHH$B!"  @A  1 ÊCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321 Press RETURN to Continue $ ERROR: Not typed: $Password: $No File$ BDOS Bad Sector$ Invalid Drive$Currently Opened$Password Error$ERROR: $Invalid or missing delimiter(s) $Try 'PAGE' or 'NO PAGE' $Requires CP/M 3.0$Enter file: $ $ERROR: Invalid file name. $1 1 u" * }0* |HҴJ>O/4\>(N2 i>!6 * & 6! 6: ,v! 6> W ʹ * ~‘ù* ~[ʟ* #" * ~N* #" * ~O* ~ H* #" ! 6 * ~P! 6* #" * ~]* ~H$ù* ~A0×* #" * ~]* ~HTù* ~G`×* #" * ~]* ~H҄ù* ~Eʐ×* #" * ~]* ~Hҹ: : /2 : ==2 : ! 6! 6\O2 :  . \ - v! q* &! p+q*  ! s+p+q* : w#6*  * #" N#Fy  ! p+q* ! p+q* ! p+q* ! p+q* ! q* &-! p+q* ! q: 2 ! 6 1! q: 2 ! 6 1! r+s+q: 2 ! 6* #s#r 1m % %!% s+q+p+q:% =2% ʍ*" :$ w*" #"" p52& aڧ:& {ҧ:& :& XX>l c!' 6>!' 6͎2( *' &l :( w:( 6:( ÷:( $:' ÷:' =2' O!l 6 :( /!' 4~2( !) q:) R>:) c>:) t>:) ‚>:) >!+ p+q** ~ʯ** >@O%:%!, 6> !, :, .%*, &** >2- *- M%!, 4´!. q>:. >:. 1>!0 p+q*/ ~ ~ H?*/ #"/ */ ~K>>!2 p+q!3 6#6:3 ҁ*1 ~?s!4 6!3 4*1 #"1 ]:4 : : <2 ! >52  %: ·: ! 6! 6lͷ: 2 ! 6 ͇" * }= * |2 % ͫXlͷ: 2  ͇" = > ͑ %* M=* } ͷ! 6! 6: / ͧH ! 6>! * & ~2 — ! 6:  ~Ү 52 : : ͅ* M%! 4w [ =ͷ\26 =:6 :6 o&"7 E"9 G"; I"= "? "A "C .*7 DM -J :\2 ͅX ͑:%ͅXͷ*9 E)*; G)*= I)*? )*A )*C )!; \e .*; \ - 26 * ~ * ~ H * #" !`i^#V#~#fo:  y  wO G:L xAڠ Ҡ a{3 _à  F F : i`N#Fogo&og_{_z#Wi!v"/!Q/+>c!K-6*/K>XG!+>yC!Q/+>c!+Q/>r–!}o|g}ʖ!#"/!/–!/ʖ!/+>c!/ͷ~g"B,U"G-!,,> c!o0ͷX:F-!,,> c!q0ͷ~*G-w#w:F-X!s0͡!F-6*G-*G-^#V#)))"I-*B,*G-^#V))W+"B,*B,>og"@,:F-f!,,> c!y0ͷ~!{0!+Q/>r2K-*I-w#w2P/>2O/2N/!/(,>t!"N-:F-X!D,LG!),>y :#!#6!Q/D,>_:O/!N/:N/2O/2N/!P/4!}0!0*L-#"L-!0A !/*!/>X!/>Xt!D,KLG!.,>y:O/!N/f:N/2O/2N/!/>X!.,!,@!D,KL(,tî!N/4!,/>c!0!0!0n !N-~#!0̓ ã!0ͬ!D,/,>c!0~U!9"0:#Z!#6!#"/r*/>$Gt!##>Gt!#0,>Gt!#6!#6!#"0!0T!F-6!"#!D,6!06:0}͐3>!D,ͧd*0!F-6!#6*##"#*# |.!"0}20!0>!#*0"0!0U!#"0!0+!#*06*0 "0!04í!"#:+.!+6:# :# :#.~!#*#~20:0 20:0Q~:0Þ:K-z"/!0Ur"/*/ 3,>Gt!0#!D,6,> c!0ͷ~Ͳ"0~# ¦*0^#V"0*0^#V"0͕!1"1!216>261251:!12:1::1!51!!1:51og~271:21!216{:71!61281*0:61o:81OLG!1>c:81og>og}281*0:81ogW"0*0:81og####"0*0*0W*00>c*0";1!;1ͷ~>291!1n&}2=1:=1!91*1:91og"1*1~og |*1>ߦw*1~?*16_*1~@*16`!914å*0++*0)"1*11>_*0^#V"31*0^#V#r+s*1*0*0^#V)))s#r*0:61_L*0*0^#V)))>t*0*0^#V)))w#w!31#`*0*31)))^#V1j`*0*0^#V)))"1*1!1>Gt*0*31)))"1*1*1>Gt*31+"31*0*31)))^#V1j!31#T*1"1*0*31)))"1*1*1>Gt*31+"31*11>Gt:71%^}2C1:C1!A1$ *0:A1_LG!>1>t!0>1xy!0>1xy !B14:A1!!1:B1o gw!0>1xy :B12!1!A14ì*00>c*0"D1!D1ͷ~^#V"F1*F1^#V> ͍!H1 *!H1> XÓ1~# s !9"2!1"1!16*1w#w*1ng | *1KLG!1>yº !1**1~ogQ1~og)1^#V*1^#V#r+sH !11>c !1*>22*1~ogQ1~Y !11xyK !24H :2K !1!1> !1* *1*1^#Vͯ1>_ *1~ogQ1~ !1*{ !1*!11xy !1*é !1**1~ogQ1~ !1* *2:1 !16!"1*1n&"1*1"1' *1#"1*1*1W7 *1*1>Ó*1~og |c !1>ߦw !1~?t !16_ !1~@‚ !16`Y2 ~# ˆ *_2^#V"e2*c2^#V"g2!"2*[2^#V"2*2*2W *]2*2ͯ"2!2 :2 *e2*2)))~# *g2^#V#*e2*2)))s#rc *e2*2)))^#V"2*g2*2))~#K *g2*2))^#V"2% *g2^#V#*g2*2))s#r*g2^#V#r+s*a2^#V*g2^#VW !i272>!c!2ͷ~*2+|´ *Y2^#VO"2þ *Y2^#V"2*2*g2++*g2^#V))s#r*g2*g2^#V))w#w*2#"2ô 2~#  *26*2LG!X2>yC *2"3*3#~>!3w:3og2~C :2 !26*e2^#V#"3!3"323!3> *3++| !"3Ñ *3>og"3*3:3og)2s#r!34d !" 3*e2^#V" 323*2"3!3"3* 3* 3W_!34:3og)2^#V" 3*e2*3)))^#V"3*2*3j/*3+" 3* 3* 3"3!36\*3*2jY*3#" 3* 3* 3W"3!36\Û :3o* 3"3u* 3"3*e2*3)))^#V"3*2*3jʛ*26*3*2s#r3 ~# ±*3^#V"#3*!3^#V"%3! ÷>2.3*3~ʟ*34*3~og"3!3A !/3*!/3>XG!3>y.!/3>X3t!/3>XG!3>y[!/3>X3t*3!3>}23:3ʐ!/3>S*3:3<_Lt*3"3!3ö*33>_*3"3!3!;3"93!3*3>!t!<3"53!L33>Gt!Q33>Gt!"'32.3*'3*#3^#VW*'3#"'3*#3*'3)))^#V!<3>p!")3*)3 |*53+*)3"73*73~ ]Æ*73~_n*736?|*73~`|*736@*)3#")38*#3*'3)))!M3>Gt*#3*'3)))^#V")32-3!)3~#ʖ:-3 ͟!<33>t!M33>t2-3!-34*%3++*)3))^#V"+3:,31!Q3:-3ogͯ3>Gt*+3O"+3M!Q3:-3ogͯ3>Gt!3A !/3*!/3>S!L3:-3ogͯ>t*%3*)3))^#V")3ø͟!.34*3~!.3!t:-3ogͯ}!;3w!;3~w*93:;3=_L3t*93!3>_!3^#V"<:F4!F46*<KLG!H<>y+!E46ð!E46!4"$Gt!'4I<>Gt!*46!>46z"!4*<@*<"r2<:E4:<>2<>2<*Gt!^<<xy;!<8!<5!<͛#E!<͛!<5:22%^}2<:!4*<@*<"!4*<@*<"2<*t!<͆!<4!<͆^#V^#V  $ "/  Later CP/M or MP/M Version Required$*#=**#={ozgY|g}o!\!l!ÍÝ3>Ý!*3>K* !*   >    !"#$%(^#V^#VF3O3*# 72gl*<"?'w#-!9~sG~#s4! 9~.Y+60e0e6 #M+r>o&9y>o&90w+Š6./G! >0 >-3T]))iO>`G>0 <  DM0 > Ew#E~#X~#W #Ý!9Oo>gy~#o>gxGGtwF#"WObk++~+ y~#/~!>)< D=M)6ɯo>g{ozg!dÄlmnpr Conversion2!Ä*%=|^#V"%=###^#V#N#Fxʿ #~ò*%=|^#V#N#F!9yx"%=:L# !9!#{z#  !!9:]#O!^# {#z!]#5#}OD*#=~r##~#fo9!NÄVWXZ\ Free Space Exhausted##^#V#{_zW;{_zW>4z˜{##^#V# ##s#rs#r#s#r+++~sw#r####}*#=}|5*{z5+F+N+V+5^{;{z;}|;{ i`~sw#r##q#p i`N#F#^#V~;q4#p+i`##s#rA"]" FREE Request Out-of-Range$ Free Space Overwrite$GKҜMbkÜiFhNhN#Fh^#V"#y2#xүi&ͩ x>!J#{#z*#*# xyxM_!^#VͤG>(Iỳ>)I|*<|6<ͤͶò">,IG> _O! O! O!0:IIWWG|e}e ڐdԒ ͒ڝÔxWN #~Iæ!wͤ*=!9{_z{ G>#I*=>=^#V#q>: >?I!oͤͤ>=I^#V|A}8.))ä#F>A> #\~ >.~ =M^#V# File: Traceback: ERROR FIXED OVERFLOW OVERFLOW UNDERFLOW ZERO DIVIDE END OF FILE UNDEFINED FILE KEYNULCONCONRDRPUNLSTBADG!]#~8  " Condition Stack Overflow$4Ox!< w#s#r#s#r!9!^# s#r!]#N!< +++++q #{Š #zʏ ++~q ++!]#5!~# ž Ú !]#N!< +++++¹ #~# +{ #z ++~ù #^#V=!L#~9!5:L#_!M#^#V"J#~#.~# !*#)))))# )| !*~#|}*#"#:L#*J#~#w# F!*#{ `! d!!#"#Ö!Copyright (c) 1980 Digital Research, v1.3 !"!="="%=2]#2L#*'= !"=q#p##}o"#=*}o|!""+w+w+r+s4w#w#s#r<2)=++*!=s#r"!=*=#"=*=DM!!=x~¨"#~+¨"+F+Nq#p*=+"=ʣ"Ҧ"=Y"!+~O~#~G!>w!/x"yʞ" >O6# x" h"=ɯ ~#fo++"!=~#"*!="²""""  Insufficient Memory$ Invalid I/O List End of Execution$#dd(Copyright (c) 1980 Digital Research V1.3MXList SYMd$PlPRINTER busy XREF 1.3 no SYM file no PRN file CP/M PRNXRFABORTED. V́ + 1@+>  FG1"z*QS cE5T @///,,D,B,G-,Q/D,D,L-,D,D,N-P-L-N-P-G-@,I-P/O/Q/G-I-D,000//D,symbol table overflow ' invalid SYM file format ! { *$'symbol table reference overflow 22i2 0# +333lXRF.XRF make error  '.XRF close error .XRF write error <<<_<<b?@ABCDEFGH{___2::2K!"M> 2I2IO* 2::?>2Ly2K> 2I2I* 2::n>2Ly2K> 2I2I* 2::œx2Ly2K> 2I2I* 2::> 2I2I* 2::>2I2I*o&)))))))a{__> >   ʏ7ApBPA2A_~2 ~2öA2~2 ~2#ÿ# 7  7ABA2IA_: 7!">2!4:ʙN>2:!4ʈ!^!FNJy*DMy2:m*# 7"<2:~Áͧ"Q:*"1# }0ڶ>2û>2:] \7<72|!DMy\2P2!|#~2 ~2k~# !6|#]Y7 <*4P:A_($Q!uw# f:@!Qw:I!u@w2Q7<4":o:gKQ2:<2:o:g"à|#u:I@wFuA<4":o:gKu-4:=2):o:g"u|# PCPM3 SYSQ!uw# f:@!Qw:I!u@w2Q7<4":ogKQCP/M 3 COPYSYS - Version 3.0$Source drive name (or return for default) $Source on  then type return $Destination drive name (or return to reboot) $Destination on then type return $Do you wish to copy CPM3.SYS? $Function complete$ERROR: Invalid drive name (Must be A through P)$ERROR: No source file on disk.$ERROR: No directory space.$ERROR: Out of data space.$ERROR: Write protected?$ERROR: Possible incompatible disk format. Type return to ignore.$ERROR: Close operation failed.$ERROR: Selected disk not on system.$ ͢ SEEK ERROR, OPERATION ABORTED >2:  Gx  8>F#( yχ y χ 8  y0 0(O͵ 0O͵ ͢ ~#O͵  ! !! #~ #~ Y #~ E #~ S7͢ ^C  ^#V#> ~ =(~!7Bɯw"=nf":~(>!7B~ݾ6|w}w{w ͍ϳxF#G44~4~f~w~w~w^VRK* ***MEMORY ERROR*** ADDRESS: ~nf *, WRITE DATA: ~*, READ DATA: ~*  |}0:8O6~#O6(yCOPYRIGHT 1982, WAVE MATE, INC.* BULLET Z80 MEMORY TEST DIAGNOSTIC V2.0 You must reset the computer to terminate this diagnostic. .>&!B! !BUٯw#> aTP"1?:P2ÄCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321 ERROR: $ $ Press RETURN to continue $ $Reading HELP.HLP index.$Too many entries in Index Table. Not enough memory.$ $ Creating HELP.HLP....$$ HELP DATHELP.DAT not on current drive.$Too many entries in Index Table. Not enough memory.$$ HELP HLPUnable to Make HELP.HLP.$Writing file HELP.HLP.$Writing file HELP.HLP.$Closing file HELP.DAT.$Closing file HELP.HLP.$HELP.HLP created $ Extracting data....$HELP HLPUnable to find file HELP.HLP.$HELP DATUnable to Make HELP.DAT.$Writing file HELP.DAT.$Unable to Close HELP.HLP.$Unable to Close HELP.DAT.$Extraction complete HELP.DAT created $ Topics available:$ ENTER .subtopic FOR INFORMATION ON THE FOLLOWING SUBTOPICS:$ $ $ $Reading file HELP.HLP.$ HELP> $Requires CP/M Version 3$,HELP HLP HELP UTILITY V1.1 At "HELP>" enter topic {,subtopic}... EXAMPLE: HELP> DIR EXAMPLES $? HELP Topic:$Not found$No HELP.HLP file on the default drive.$1?1?!E6!,6͈"-*-|*-}0HҷN1=2/1<_! p{201!C6!C6ͷ 2j:A+::BJ: \u\͡2 :?/;1X:j\!)6X!,62j:j&!)61x͛zdʛ͚=x͛˜!)6,V 2E H:E/ ,V 2E:E/ IX,V 2E H*jM.,V 2E H,V 2E HPX,V 2E H!)6:E/2j\\2D:ZNEv!Kq*K&!Mp+q*L !Op+q*N !Pq*P& !Rp+q*Q!Tp+q *S 6 *S 6*S!Vp+q*U!Xp+q*W!Zp+q*Y!\p+q *[ 6 *[ 6*[!^p+q*]!!`p+q*_!bp+q*a$!er+s+qX*dDMXX:ctE!jr+s+p+q+q*f*gDM*i -’!nr+s+p+q!o6#6:p *p&*k~ H *p&*k*p&*m  *p&*k*p&*m  !o6 !o6!p6 :p<2pí:o!qq:q<2q>!qR \H !q6R !E6!q6:q!sp+q!t6:@/!C *r~<*rwO:/ X*r6*r~ž x*rwÉ X*r~½ \*rwE *r~ !t6*r6  H *r6 H:tͼ"u*u"w!{6!"y:{/>!wH҇ >y)))) DM%\O \o&"yN*y)))) ~$e !{6:{/҄ >w+s#r*y"y %>w:{/HҶ \o&"yN!|6:! !|6:!| *|& ~ *|& 6 *|& ~, *|& 6 :|<2| !|6!:|*|& ~ HA :|<2| *|& ~.d :)2}*|& 6 i !}6:}2|> !|ڛ *|&͏x u:|<2|o :}2|!~6!6#6*~& ~:/H! *~& ~  !6*~& ~ *~& ~[H*~& ~H: :| HHҥ *~& >`*~& ~{Hp *~& ~ *|&͏x *& HqÔ *~& *|&͏x *& w:~<2~:<2 :|<2|> !|! !6 *~& ~[ :|=o&͏x ~ :|=2|*|&͏x 6[:~<2~:|<2|!6 :~<2~î !?6#6#6#6>!|'!6: '*&͏x ~[*&͏ ~C !A6:|==2|*&͏ ~E¤ !B6:|==2|*&͏ ~N !@6:|==2|*&͏ ~L !?6#6:|==2|*&͏ ~ :|==2|:|=2|!6 :<2= :|&X!6>!` *&)))) >u:<26!6>#w#6ͼ"*" \Ju\͡WN!E6:E/\H"!6:ր:E/H*& ~!E6*& ~/!6:E/*& ~/H**M! 2:<2::E/H*& ~0*))))  w*M! 2!6: :E/H*& ~ H*& >`*& ~{H*& ~ *)))) *& w*& *)))) *& w*M! 2:<2i:E/\5*))))  }u*))))  #~u*))))  N#F *))))  q#p*))))  :w*#"*!p>ͭ:<2>+s#r>:E/H\2vN*"*! *)))) u*"*M! 2þâ%:<2 u͑lF2F͑\2NfuF2!"*+!*))))  :d*))))  q#p*"҇!":=!6!ͣ DM%)2͑F2F͑\2N*"|u\2!E6:E/!"*":E/>!HҴ!ͣ DM%\ʝ!E6ñ>+s#r*#"d!"*+!!ͣ DM%2͑\2N*"ҺP\02NC*NBXUX \ku\͡oxN FuF͑F\2N%!6\2:/H:Y$!6è!E6:!E6F2ͼ":E/ҽ!"*":E/>!H]!ͣ DM%\F!E6Z>+s#r*#" !"*+!ں!ͣ DM%FʭF2F͑\2N*"c\NFF͑NX!"}22:)"<2: ,:)!"#**"!"1!6*"!":/G*)))) ~$^!6D*))))  :!:/Ұ!6,V 2:›0XáCX,V 2X**0&p>ͭ,V 2 H!6> !*& 6 :<2!6$ *)))) DMuX*#"=*))))  ~!=!6*#"=:],V 2X%!6#6!6#6!":/:/HҼ*)))) ~$ʴ*))))  :)<{*)&͏x *)))) ͛2:q *)))) *)&͏x u:)<2):/:)2!6>!)n&͏x ~ H*)&͏x ~[Hb!6!6n*#"!6x*#"ñ:Ҫ*))))  :Ң*#"ç!6ñ*#"ù!6z:**#"**))))  DM}u*))))  #DM~u!6*))))  ~2D*))))  ~2):!q!6!::E/Hҙ,V 2E:E/Җ!6:!{X:<2a*&͏x DMX:<27 H*)M.:E/ҷ,V 2E:E/\\2DN!6:/:E/H\H:D=2:<2O>/:/H*& ~29!E6!6:/:E/H:*& ~/HHҗ:<2*M! 2*& :=O! w>:§!6ò*& 6$:E/:/H: :@/H,V 2E*MH>!X!6 !D6!E6u,V 2Xh*& 6!,6ͷ 2::?/H_1X:_ogDM!>))덑o|g҉ =wDM!>))Ҟ =–^#V) §_{ozgi`N#Fogo&og_{_z#W $COMMANDS CONVENTIONS 3CNTRLCHARS COPYSYS $VDATE &dEXAMPLES (3DEVICE *:OPTIONS 0EXAMPLES 5 DIR ?TBUILT-IN BVEXAMPLES FWITHOPTIONS N)OPTIONS Q~EXAMPLES bjDUMP kED lKCOMMANDS n7EXAMPLES kERASE mOPTION pEXAMPLES lFILESPEC GENCOM eOPTIONS EXAMPLES |GET OPTIONS uEXAMPLES HELP jHEXCOM ZINITDIR LIB *OPTIONS GMODIFIERS *EXAMPLES 7LINK OPTIONS oEXAMPLES MAC EXAMPLES \OPTIONS $PATCH ]PIP (COPY) CEXAMPLES 6OPTIONS &)PUT /'OPTIONS 5MEXAMPLES >-RENAME D9EXAMPLES GRMAC NvOPTIONS PREXAMPLE T\SAVE VzEXAMPLE ZSET `LABEL c_EXAMPLES djPASSWORDS fbMODES i#ATTRIBUTES o&EXAMPLES wDEFAULT |YTIME-STAMPS ~OPTIONS -EXAMPLES ^DRIVES 4SETDEF MEXAMPLES mSHOW WEXAMPLES pSID COMMANDS bEXAMPLES eUTILITIES uSUBMIT 4SUBFILE EXECUTE  PROFILE.SUB  TYPE *EXAMPLES GUSER IEXAMPLES ZXREF $ $ )`$ j" ///1commands CP/M 3 Command Format: A>COMMAND {command tail} A CP/M 3 command line is composed of a command, an optional command tail, and a carriage return. The command is the name or filename of a program to be executed. The optional command tail can consist of a drive specification, one or more file specifications, and some options or parameters. ///2conventions COMMAND CONVENTIONS The following special symbols define command syntax. {} surrounds an optional item. | separates alternative items in a command line. indicates# a carriage return. ^ indicates the Control Key. n substitute a number for n. s substitute a string (group) of characters for s. o substitute an option or option list for o. [] type square brackets to enclose an option list. () type parens to enclose a range of options within an option list. RW Read-Write attribute - opposite of RO RO Read-Only attribute - opposite of RW SYS System attribute - opposite of DIR DIR Directory attribute - opposite of SYS ... preceding element can be repeated as many times as desired. * wildcard: replaces all or part of a filename and/or filetype. ? wildcard: replaces any single character in the same position of a filename and/or filetype. ///1cntrlchars Control Character Function CTRL-A moves cursor one character to the left. Banked system only. CTRL-B moves cursor from beginning to end of command line and back without affecting command. Banked system only. CTRL-C stops executing program when entered at the system prompt or after CTRL-S. CTRL-E forces a physical carriage return without sending command to CP/M 3. CTRL-F moves cursor one character to the right. Banked system only. CTRL-G deletes character at current cursor position if in the middle of a line. Banked system only. CTRL-I same as the TAB key. CTRL-H delete character to the left of cursor. CTRL-J moves cursor to the left of the command line and sends command to CP/M 3. Line feed, has same effect as carriage return. CTRL-K deletes character at cursor and all characters to the right. CTRL-M same as carriage return. CTRL-P echoes console output to the list device. CTRL-Q restarts screen scrolling after a CTRL-S. CTRL-R retypes the characters to the left of the cursor  on a new line; updates the command line buffer. CTRL-S stops screen scrolling. CTRL-U updates the command line buffer to contain the characters to the left of the cursor; deletes current line. CTRL-W recalls previous command line if current line is empty; otherwise moves cursor to end of line. CTRL-J,-M,-R,-U and RETURN update the command line buffer for recall with CTRL-W. Banked system only. CTRL-X deletes all characters to the left of the cursor. ///1COPYSYS Syntax: COPYSYS Explanation: COPYSYS copies the CP/M 3 system from a CP/M 3 system diskette to another diskette. The new diskette must have the same format as the original system diskette. Example: A>COPYSYS ///1DATE Syntax: DATE {CONTINUOUS} DATE {time-specification} DATE SET Explanation: The DATE command lets you display and set the date and time of day. ///2Examples A>DATE Displays the current date and time. A>DATE C Displays the date and time continuously. A>DATE 08/14/82 10:30:0 Sets the date and time. A>DATE SET Prompts for date and time entries. ///1DEVICE Syntax: DEVICE { NAMES | VALUES | physical-dev | logical-dev} DEVICE logical-dev=physical-dev {option} {,physical-dev {option},...} DEVICE logical-dev = NULL DEVICE physical-dev {option} DEVICE CONSOLE [ PAGE | COLUMNS = columns | LINES = lines] Explanation: DEVICE displays current logical device assignments and physical device names. DEVICE assigns logical devices to peripheral devices attached to the computer. DEVICE also sets the communications protocol and speed of a peripheral device, and displays or sets the current console screen size. ///2Options [ XON | NOXON | baud-rate ] XON refers to the XON/XOFF communications protocol. NOXON indicates no protocol and the computer sends data to the device whether or not the device is ready to receive it. baud-rate is the speed of the device. The system accepts the following baud rates: 50 75 110 134 150 300 600 1200 1800 2400 3600 4800 7200 9600 19200 ///2Examples A>DEVICE Displays the physical devices and current assignments of the logical devices in the system. A>DEVICE NAMES Lists the physical devices with a summary of the device characteristics. A>DEVICE VALUES Displays the current logical device assignments. A>DEVICE CRT Displays the at#tributes of the physical device CRT. A>DEVICE CON Displays the assignment of the logical device CON: A>DEVICE CONOUT:=LPT,CRT Assigns the system console output (CONOUT:) to the printer (LPT) and the screen (CRT). A>DEVICE AUXIN:=CRT2 [XON,9600] Assigns the auxiliary logical input device (AUXIN:) to the physical device CRT using protocol XON/XOFF and sets the transmission rate for the device at 9600. A>DEVICE LST:=NULL Disconnects the list output logical device (LST:). A>DEVICE LPT [XON,9600] Sets the XON/XOFF protocol for the physical device LPT and sets the transmission speed at 9600. A>DEVICE CONSOLE [PAGE] Displays the current console page width in columns and length in lines. A>DEVICE CONSOLE [COLUMNS=40 LINES=16] Sets the screen size to 40 columns and 16 lines. ///1DIR The DIR command displays the names of files and the characteristics associated with the files. The DIR command has three distinct references: DIR DIRS DIR with Options DIR and DIRS are built-in utilities. DIR with Options is a transient utility and must be loaded into memory from the disk. ///2Built-in Syntax: DIR {d:} DIR {filespec} DIRS {d:} DIRS {filespec} Explanation: The DIR and DIRS Built-in commands display the names of files cataloged in the directory of an on-line disk. DIR lists the names of files in the current user number that have the Directory (DIR) attribute. DIR accepts the * and ? wildcards in the file specification. ///3Examples A>DIR Displays all files in user 0 on drive A that have the Directory attribute. A>DIR B: Displays all DIR files in user 0 on drive B. 2A>DIR C:ZIPPY.DAT Displays the name ZIPPY.DAT if the file is in user 2 on drive C. 4A>DIR *.BAS Displays all DIR files with filetype BAS in user 4 on drive A. B3>DIR X*.C?D Displays all DIR files in user 3 on drive B whose filename begins with the letter X, and whose three character filetype contains the first character C and last character D. A>DIRS Displays all files for user 0 on drive A that have the system (SYS) attribute. A>DIRS *.COM Displays all SYS files with filetype COM on drive A in user 0. A command (.COM) file in user 0 with the system attribute can be accessed from any user number on that drive, and from any drive in the search chain (see SETDEF). ///2withOptions Syntax: DIR {d:} [options] DIR {filespec} {filespec} ... [options] Explanation: The DIR command with options is an enhanced version of the DIR built-in command and displays your files in a variety of ways. DIR can search for files on any or all drives, for any or all user numbers. One or two letters is sufficient to identify an option. You need not type the right hand square bracket. ///3Options Option Function ATT displays the file attributes. DATE displays date and time stamps of files. DIR displays only files that have the DIR attribute. DRIVE=ALL displays files on all on-line drives. DRIVE=(A,B,C,...,P) displays files on the drives specified. DRIVE=d displays files on the drive specified by d. EXCLUDE displays files that DO NOT MATCH the files specified in the command line. FF sends an initial form feed to the printer device if the printer has been activated by CTRL-P. FULL shows the name, size, number of 128-byte records, and attributes of the files. If there is a directory label on the drive, DIR shows the password protection mode and the time stamps. If there is no directory label, DIR displays two file entries on a line, omitting the password and time stamp columns. The display is alphabetically sorted. (See SET for a description of file attributes, directory labels, passwords and protection modes.) LENGTH=n displays n lines of printer output before inserting a table heading. n is a number between 5 and 65536. MESSAGE displays the names of drives and user numbers DIR is searching. NOSORT displays files in the order it finds them on the disk. RO displays only the files that have the Read-Only attribute. RW displays only the files that are set to Read-Write. SIZE displays the filename and size in kilobytes (1024 $ bytes). SYS displays only the files that have the SYS attribute. USER=ALL displays all files in all user numbers for the default or specified drive. USER=n displays the files in the user number specified by n. USER=(0,1,...,15) displays files under the user numbers specified. ///3Examples A>DIR C: [FULL] Displays full set of characteristics for all files in user 0 on drive C. A>DIR C: [DATE] Lists the files on drive C and their dates. A>DIR D: [RW,SYS] Displays all files in user 0 on drive D with Read-Write and System attributes. 3A>DIR [USER=ALL, DRIVE=ALL] Displays all the files in all user numbers (0-15) in all on- line drives. B6>DIR [exclude] *.DAT Lists all the files on drive B in user 6 that do not have a filetype of .DAT. 3B>DIR [SIZE] *.PLI *.COM *.ASM Displays all the files of type PLI, COM, and ASM in user 3 on drive B in size display format. A>DIR [drive=all user=all] TESTFILE.BOB DIR displays the filename TESTFILE.BOB if it is found on any drive in any user number. A>DIR [size,rw] D: DIR lists each Read-Write file that resides on Drive D, with its size in kilobytes. Note that D: is equivalent to D:*.*. ///1DUMP Syntax: DUMP filespec Explanation: DUMP displays the contents of a file in hexadecimal and ASCII format. Example: A>DUMP ABC.TEX ///1ed Format: ED input-filespec {d:|output-filespec} Explanation: Character file editor. To redirect or rename the new version of the file specify the destination drive or destination filespec. ///2commands ED Command Summary Command Action nA append n lines from original file to memory buffer 0A append file until buffer is one half full #A append file until buffer is full (or end of file) B, -B move CP to the beginning (B) or bottom (-B) of buffer nC, -nC move CP n characters forward (C) or back (-C) through buffer nD, -nD delete n characters before (-D) or from (D) the CP E save new file and return to CP/M-86 Fstring{^Z} find character string H save new file, reedit, use new file as original file I enter insert mode Istring{^Z} insert string at CP Jsearch_str^Zins_str^Zdel_to_str juxtapose strings nK, -nK delete (kill) n lines from the CP nL, -nL, 0L move CP n lines nMcommands execute commands n times n, -n move CP n lines and display that line n: move to line n :ncommand execute command through line n Nstring{^Z} extended find string O return to original file nP, -nP  move CP 23 lines forward and display 23 lines at console Q abandon new file, return to CP/M-86 R{^Z} read X$$$$$$$.LIB file into buffer Rfilespec{^Z} read filespec into buffer Sdelete string^Zinsert string substitute string nT, -nT, 0T type n lines U, -U upper-case translation V, -V line numbering on/off 0V display free buffer space nW write n lines to new file 0W write until buffer is half empty nX write or append n lines to X$$$$$$$.LIB nXfilespec{^Z} write n lines to filespec; append if previous xcommand applied to same file 0x{^Z} delete file X$$$$$$$.LIB 0xfilespec{^Z} delete filespec nZ wait n seconds Note: CP points to the current character being referenced in the edit buffer. Use {^Z} to separate multiple commands on the same line. ///2Examples A>ED TEST.DAT A>ED TEST.DAT B: A>ED TEST.DAT TEST2.DAT A>ED TEST.DAT B:TEST2.DAT ///1erase Syntax: ERASE {filespec} {[CONFIRM]} Explanation: The ERASE command removes one or more files from the directory of a disk. Wildcard characters are accepted in the filespec. Directory and data space are automatically reclaimed for later use by another file. The ERASE command can be abbreviated to ERA. ///2Option [CONFIRM] option informs the system to prompt for verification before erasing each file that matches the filespec. CONFIRM can be abbreviated to C. ///2Examples A>ERASE X.PAS Removes the file X.PAS from the disk in drive A. A>ERA *.PRN Confirm (Y/N)?Y All files with the filetype PRN are removed from the disk in drive A. B>ERA A:MY*.* [CONFIRM] Each file on drive A with a fi$lename that begins with MY is displayed with a question mark for confirmation. Type Y to erase the file displayed, N to keep the file. A>ERA B:*.* Confirm (Y/N)?Y All files on drive B are removed from the disk. ///1filespec FILESPEC FORMAT CP/M 3 identifies every file by its unique file specification, which can consist of four parts: the drive specification, the filename, the filetype and the password. The term "filespec" indicates any valid combination of the four parts of a file specification, all separated by their appropriate delimiters. A colon must follow a drive letter. A period must precede a filetype. A semicolon must precede a password. The symbols and rules for the parts of a file specification follow: d: drivespec optional single alpha character (A-P) filename filename 1-8 letters and/or numbers typ filetype optional 0-3 letters and/or numbers password password optional 0-8 letters and/or numbers Valid combinations of the elements of a CP/M 3 file specification are: filename d:filename filename.typ d:filename.typ filename;password d:filename;password filename.typ;password d:filename.typ;password If you do not include a drive specifier, CP/M 3 automatically uses the default drive. Some CP/M 3 commands accept wildcard (* and ?) characters in the filename and/or filetype parts of the command tail. A wildcard in the command line can in one command reference many matching files on the default or specified user number and drive. (See Commands). ///1GENCOM Syntax: GENCOM {COM-filespec} {RSX-filespec} ... {[LOADER | NULL | SCB=(offset,value)]} Explanation: The GENCOM command creates a special COM file with attached RSX files. The GENCOM command can also restore a previously GENCOMed file to the original COM file without the header and RSX's. GENCOM can also attach header records to COM files. ///2Options LOADER sets a flag to keep the program loader active. NULL indicates that only RSX files are specified. GENCOM creates a dummy COM file for the RSX files. The output COM filename is taken from the filename of the first RSX-filespec. SCB=(offset,value) sets the System Control Block from the program by using the hex values specified by (offset,value). ///2Examples A>GENCOM MYPROG PROG1 PROG2 Generates a new COM file MYPROG.COM with attached RSX's PROG1 and PROG2. A>GENCOM PROG1 PROG2 [NULL] Creates a COM file PROG1.COM with RSX's PROG1 and PROG2. A>GENCOM MYPROG  GENCOM takes MYPROG.COM, strips off the header and deletes all attached RSX's to restore it to its original COM format. A>GENCOM MYPROG PROG1 PROG2 GENCOM looks at the already-GENCOMed file MYPROG.COM to see if PROG1.RSX and PROG2.RSX are already attached RSX files in the module. If either one is already attached, GENCOM replaces it with the new RSX module. Otherwise, GENCOM appends the specified RSX files to the COM file. ///1GET Syntax: GET {CONSOLE INPUT FROM} FILE filespec{[{ECHO|NO ECHO} | SYSTEM]} GET {CONSOLE INPUT FROM} CONSOLE Explanation: GET directs the system to take console input from a file for the next system command or user program entered at the console. Console input is taken from a file until the program terminates. If the file is exhausted before program input is terminated, the program looks for subsequent input from the console. If the program terminates before exhausting all its input, the system reverts back to the console for console input. With the SYSTEM option, the system immediately goes to the specified file for console input. The system reverts to the console for input when it reaches the end of file. Re-direct the system to the console for console input with the GET CONSOLE INPUT FROM CONSOLE command as a command line in the input file. ///2Options ECHO specifies that input is echoed to the console. This is the default option. NO ECHO specifies that file input is not echoed to the console. The program output and the system prompts are not affected by this option and are still echoed to the console. SYSTEM specifies that all system input is immediately taken from the disk file specified in the command line. GET takes system and program in%put from the file until the file is exhausted or until GET reads a GET console command from the file. ///2Examples A>GET FILE XINPUT A>MYPROG Tells the system to activate the GET utility. Since SYSTEM is not specified, the system reads the next input line from the console and executes MYPROG. If MYPROG program requires console input, it is taken from the file XINPUT. When MYPROG terminates, the system reverts back to the console for console input. A>GET FILE XIN2 [SYSTEM] Immediately directs the system to get subsequent console input from file XIN2 because it includes the SYSTEM option. The system reverts back to the console for console input when it reaches the end of file in XIN2. Or XIN2 may redirect the system back to the console if it contains a GET CONSOLE command. A>GET CONSOLE Tells the system to get console input from the console. This command may be used in a file (previously specified in a GET FILE command), which is already being read by the system for console input. It is used to re-direct the console input back to the console before the end-of-file is reached. ///1HELP Syntax: HELP {topic} {subtopic1 ... subtopic8} {[NOPAGE|LIST]} Explanation: HELP displays a list of topics and provides summarized information for CP/M 3 commands. HELP topic displays information about that topic. HELP topic subtopic displays information about that subtopic. One or two letters is enough to identify the topics. After HELP displays information for your topic, it displays the special prompt HELP> on your screen, followed by a list of subtopics. - Enter ? to display list of main topics. - Enter a period and subtopic name to access subtopics. - Enter a period to redisplay what you just read. - Press the RETURN key to return to the CP/M 3 system prompt. - [NOPAGE] option disables the 24 lines per page console display. - Press any key to exit a display and return to the HELP> prompt. Examples: A>HELP A>HELP DATE A>HELP DIR OPTIONS A>HELP>.OPTIONS HELP>SET HELP>SET PASSWORD HELP>.PASSWORD HELP>. HELP> ///1HEXCOM Syntax: HEXCOM filename Explanation: The HEXCOM Command generates a command file (filetype .COM) from a .HEX input file. It names the output file with the same filename as the input file but with filetype .COM. HEXCOM always looks for a file with filetype .HEX. Example: A>HEXCOM B:PROGRAM Generates a command file PROGRAM.COM from the input hex file PROGRAM.HEX. ///1INITDIR Syntax: INITDIR {d:} Explanation: The INITDIR Command initializes a disk directory to allow date and time stamping of files on that disk. INITDIR can also recover time/date directory space. Example: A>INITDIR C: INITDIR WILL ACTIVATE TIME-STAMPS FOR SPECIFIED DRIVE. Do you want to re-format the directory on C: (Y/N)?Y ///1LIB Syntax: LIB filespec{[I|M|P|D]} LIB filespec{[I|M|P]}=filespec{modifier} {,filespec{modifier} ... } Explanation: A library is a file that contains a collection of object modules. Use the LIB utility to create libraries, and to append, replace, select or delete modules from an existing library. Use LIB to obtain information about the contents of library files. LIB creates and maintains library files that contain object modules in Microsoft REL file format. These modules are produced by Digital Research's relocatable macro-assembler program, RMAC, or any other language translator that pruduces modules in Microsoft REL file format. You can use LINK-80 to link the object modules contained in a library to other object files. LINK-80 automatically selects from the library only those modules needed by the program being linked, and then forms an executable file with a filetype of COM. ///2Options I The INDEX option creates an indexed library file of type .IRL. LINK-80 searches faster on indexed libraries than on non-indexed libraries. M The MODULE option displays module names. P The PUBLICS option displays module names and the public variables for the new library file. D The DUMP option displays the contents of object modules in ASCII form. ///2Modifiers Use modifiers in the command line to instruct LIB to delete, replace, or select modules in a library file. Angle brackets enclose the modules to be deleted or replaced. P%arentheses enclose the modules to be selected. LIB Modifiers Delete Replace If module name and filename are the same this shorthand can be used: Select (modFIRST-modLAST,mod1,mod2,...,modN) ///2Examples A>LIB TEST4[P] Displays all modules and publics in TEST4.REL. A>LIB TEST5[P]=FILE1,FILE2 Creates TEST5.REL from FILE1.REL and FILE2.REL and displays all modules and publics in TEST5.REL. A>LIB TEST=TEST1(MOD1,MOD4),TEST2(C1-C4,C6) Creates a library file TEST.REL from modules in two source files. TEST1.REL contributes MOD1 and MOD4. LIB extracts modules C1, C4, and all the modules located between them, as well as module C6 from TEST2.REL. A>LIB FILE2=FILE3 Creates FILE2.REL from FILE3.REL, omitting MODA which is a module in FILE3.REL. A>LIB FILE6=FILE5 Creates FILE6.REL from FILE5.REL, FILEB.REL replaces MODA. A>LIB FILE6=FILE5 Module THISNAME is in FILE5.REL. When LIB creates FILE6.REL from FILE5.REL the file THISNAME.REL replaces the similarly named module THISNAME. A>LIB FILE1[I]=B:FILE2(PLOTS,FIND,SEARCH-DISPLAY) Creates FILE1.IRL on drive A from the selected modules PLOTS, FIND, and modules SEARCH through the module DISPLAY, in FILE2.REL on drive B. ///1LINK Syntax: LINK d:{filespec,{[options]}=}filespec{[options]}{,...} Explanation: LINK combines relocatable object modules such as those produced by RMAC and PL/I-80 into a .COM file ready for execution. Relocatable files can contain external references and publics. Relocatable files can reference modules in library files. LINK searches the library files and includes the referenced modules in the output file. See the CP/M 3 Programmer's Utilities Guide for a complete description of LINK- 80. ///2Options Use LINK option switches to control execution parameters. Link options follow the file specifications and are enclosed within square brackets. Multiple switches are separated by commas. LINK-80 Options A Additional memory; reduces buffer space and writes temporary data to disk B BIOS link in banked CP/M 3 system. 1. Aligns data segment on page boundary. 2. Puts length of code segment in header. 3. Defaults to .SPR filetype. Dhhhh Data origin; sets memory origin for common and data area Gn Go; set start address to label n Lhhhh Load; change default load address of module to hhhh. Default 0100H Mhhhh Memory size; Define free memory requirements for MP/M modules. NL No listing of symbol table at console NR No symbol table file OC Output .COM command file. Default OP Output .PRL page relocatable file for execution under MP/M in relocatable segment OR Output .RSP resident system process file for execution under MP/M OS Output .SPR system page relocatable file for execution under MP/M Phhhh Program origin; changes default program origin address to hhhh. Default is 0100H. Q Lists symbols with leading question mark S Search preceding file as a library $Cd Destination of console messages d can be X (console), Y (printer), or Z (zero output). Default is X. $Id Source of intermediate files; d is disk drive A-P. Default is current drive. $Ld Source of library files; d is disk drive A-P. Default is current drive. $Od Destination of of object file; d can be Z or disk drive A-P. Default is to same drive as first file in the LINK-80 command. $Sd Destination of symbol file; d can be Y or Z or disk drive A-P. Default is to same drive as first file in LINK-80 command. ///2Examples A>LINK b:MYFILE[NR] LINK-80 on drive A uses as input MYFILE.REL on drive B and p&roduces the executable machine code file MYFILE.COM on drive B. The [NR] option specifies no symbol table file. A>LINK m1,m2,m3 LINK-80 combines the separately compiled files m1, m2, and m3, resolves their external references, and produces the executable machine code file m1.COM. A>LINK m=m1,m2,m3 LINK-80 combines the separately compiled files m1, m2, and m3 and produces the executable machine code file m.COM. A>LINK MYFILE,FILE5[s] The [s] option tells LINK-80 to search FILE5 as a library. LINK-80 combines MYFILE.REL with the referenced subroutines contained in FILE5.REL on the default drive A and produces MYFILE.COM on drive A. ///1mac Syntax: MAC filename {$options} Explanation: MAC, the CP/M 3 macro assembler, reads assembly language statements from a file of type .ASM, assembles the statements, and produces three output files with the input filename and filetypes of .HEX, .PRN, and .SYM. Filename.HEX contains INTEL hexadecimal format object code. Filename.PRN contains an annotated source listing that you can print or examine at the console. Filename.SYM contains a sorted list of symbols defined in the program. ///2Examples A>MAC SAMPLE A>MAC SAMPLE $PB AA HB SX ///2options Use options to direct the input and output of MAC. Use a letter with the option to indicate the source and destination drives, and console, printer, or zero output. Valid drive names are A thru O. X, P and Z specify console, printer, and zero output, respectively. Assembly Options That Direct Input/Output A source drive for .ASM file (A-O) H destination drive for .HEX file (A-O, Z) L source drive for macrolibrary .LIB files called by the MACLIB statement. P destination drive for .PRN file (A-O, X, P, Z)  S destination drive for .SYM file Assembly Options That Modify Contents Of Output File +L lists input lines read from macrollibrary .LIB files -L suppresses listing (default) +M lists all macro lines as they are processed during assembly -M suppresses all macro lines as they are read during assembly *M lists only hex generated by macro expansions +Q lists all LOCAL symbols in the symbol list -Q suppresses all LOCAL symbols in the symbol list (default) +S appends symbol file to print file -S suppresses creation of symbol file +1 produces a pass 1 listing for macro debugging in .PRN file -1 suppress listing on pass 1 (default) ///1PATCH Syntax: PATCH filename{.typ} {n} Explanation: The PATCH command displays or installs patch number n to the CP/M 3 system or command files. The patch number n must be between 1 and 32 inclusive. Example: A>PATCH SHOW 2 Patches the SHOW.COM system file with patch number 2. ///1PIP (copy) Syntax: DESTINATION SOURCE PIP d:{Gn} | filespec{[Gn]} = filespec{[o]},... | d:{[o]} Explanation: The file copy program PIP copies files, combines files, and transfers files between disks, printers, consoles, or other devices attached to your computer. The first filespec is the destination. The second filespec is the source. Use two or more source filespecs separated by commas to combine two or more files into one file. [o] is any combination of the available options. The [Gn] option in the destination filespec tells PIP to copy your file to that user number. PIP with no command tail displays an * prompt and awaits your series of commands, entered and processed one line at a time. The source or destination can be any CP/M 3 logical device. ///2Examples COPY A FILE FROM ONE DISK TO ANOTHER A>PIP b:=a:draft.txt  A>PIP b:draft.txt = a: B3>PIP myfile.dat=A:[G9] A9>PIP B:[G3]=myfile.dat COPY A FILE AND RENAME IT A5>PIP newdraft.txt=oldraft.txt C8>PIP b:newdraft.txt=a:oldraft.txt COPY MULTIPLE FILES A>PIP b:=draft.* A>PIP b:=*.* B>PIP b:=c:.*.* C>PIP b:=*.txt[g5] C>PIP a:=*.com[wr] B>PIP a:[g3]=c:*.* COMBINE MULTIPLE FILES A>PIP b:new.dat=file1.dat,file2.dat COPY, RENAME AND PLACE IN USER 1 A>pip newdraft.txt[g1]=oldraft.txt COPY, RENAME AND GET FROM USER 1 A>PIP newdraft.txt=oldraft.txt[g1] COPY TO/FROM LOGICAL DEVICES A>PIP b:funfile.sue=con: A>PIP lst:=con: A>PIP lst:=b:draft.txt[t8] A>PIP prn:=b:draft.txt ///2options PIP OPTIONS A Archive. Copy only files that have been changed since the last copy. C Confirm. PIP prompts for confirmation before each file copy. Dn Delete any characters past co&lumn n. E Echo transfer to console. F Filter form-feeds from source data. Gn Get from or go to user n. H Test for valid Hex format. I Ignore :00 Hex data records and test for valid Hex format. K Kill display of filespecs on console. L Translate upper case to lower case. N Number output lines O Object file transfer, ^Z ignored. Pn Set page length to n. (default n=60) Qs^Z Quit copying from source at string s. R Read files that have been set to SYStem. Ss^Z Start copying from the source at the string s. Tn Expand tabs to n spaces. U Translate lower case to upper case. V Verify that data has been written correctly. W Write over Read Only files without console query. Z Zero the parity bit. All options except C,G,K,O,R,V and W force an ASCII file transfer, character by character, terminated by a ^Z. ///1PUT Syntax: PUT CONSOLE {OUTPUT TO} FILE filespec {option} | CONSOLE PUT PRINTER {OUTPUT TO} FILE filespec {option} | PRINTER PUT CONSOLE {OUTPUT TO} CONSOLE PUT PRINTER {OUTPUT TO} PRINTER Explanation: PUT puts console or printer output to a file for the next command entered at the console, until the program terminates. Then console output reverts to the console. Printer output is directed to a file until the program terminates. Then printer output is put back to the printer. PUT with the SYSTEM option directs all subsequent console/printer output to the specified file. This option terminates when you enter the PUT CONSOLE or PUT PRINTER command. ///2Options [ {ECHO | NO ECHO} {FILTER | NO FILTER} | {SYSTEM} ] ECHO specifies that output is echoed to the console. This is the default option when you direct console output to a file. NO ECHO specifies that file output is not echoed to the  console. NO ECHO is the default for the PUT PRINTER command. FILTER specifies filtering of control characters, which means that control characters are translated to printable characters. For example, an ESCape character is translated to ^[. NO FILTER means that PUT does not translate control characters. This is the default option. SYSTEM specifies that system output as well as program output is written to the file specified by filespec. Output is written to the file until a subsequent PUT CONSOLE command redirects console output back to the console. ///2Examples A>PUT CONSOLE OUTPUT TO FILE XOUT [ECHO] Directs console output to file XOUT with the output echoed to the console. A>PUT PRINTER OUTPUT TO FILE XOUT A>MYPROG Directs  the printer output of program MYPROG to file XOUT. The output is not echoed to the printer. A>PUT PRINTER OUTPUT TO FILE XOUT2 [ECHO,SYSTEM] Directs all printer output to file XOUT2 as well as to the printer (with ECHO option), and the PUT is in effect until you enter a PUT PRINTER OUTPUT TO PRINTER command. A>PUT CONSOLE OUTPUT TO CONSOLE Directs console output back to the console. A>PUT PRINTER OUTPUT TO PRINTER Directs printer output back to the printer. ///1RENAME Syntax: RENAME {new-filespec=old-filespec} Explanation: RENAME lets you change the name of a file in the directory of a disk. To change several filenames in one command use the * or ? wildcards in the file specifications. The RENAME command can be abbreviated REN. REN prompts you for input. ///2Examples A>RENAME NEWFILE.BAS=OLDFILE.BAS The file OLDFILE.BAS changes to NEWFILE.BAS on drive A. A>RENAME The system prompts for the filespecs: Enter New Name:X.PRN Enter Old Name:Y.PRN Y .PRN=X .PRN A> File X.PRN is renamed to Y.PRN on drive A. B>REN A:PRINTS.NEW = PRINCE.NEW The file PRINCE.NEW on drive A changes to PRINTS.NEW on drive A. A>RENAME S*.TEX=A*.TEX The above command renames all the files matching A*.TEX to files with filenames S*.TEX. A>REN B:NEWLIST=B:OLDLIST The file OLDLIST changes to NEWLIST on drive B. Since the second drive specifier, B: is implied by the first one, it is unnecessary in this example. The command line above has the same effect as the following: A>REN B:NEWLIST=OLDLIST or A>REN NEWLIST=B:OLDLIST ///1RMAC Syntax: RMAC filespec {$Rd | $Sd | $Pd} Explanation: RMAC, a relocatable macro assembler, assembles .ASM file's of into .REL files that you can link to create .COM files. ///2options RMAC options specify the destination of the output files. Replace d with the destination drive letter for the output files. Option d=output option R- drive for REL file (A-O, Z) S- drive for SYM file (A-O, X, P, Z) P- drive for PRN file (A-O, X, P, Z) A-O specifies drive A-O. X means output to the console. P means output to the printer. Z means zero output. ///2Example A>RMAC TEST $PX SB RB Assembles the file TEST.ASM from drive A, sends the listing file (TEST.PRN) to the console, puts the symbol file (TEST.SYM) on drive B and puts the relocatable object file (TEST.REL) on drive B. ///1SAVE Syntax: SAVE Explanation: SAVE copies the contents of memory to a file. To use SAVE, first issue the SAVE command, then run your program which reads a file into memory. Your program exits to the SAVE utility which prompts you for a filespec to which it copies the contents of memory, and the beginning and ending address of the memory to be SAVEd. ///2Example A>SAVE Activates the SAVE utility. Now enter the name of the program which loads a file into memory. A>SID dump.com Next, execute the program. #g0 When the program exits, SAVE intercepts the return to the system and prompts the user for the filespec and the bounds of memory to be SAVEd. SAVE Ver 3.0 Enter file (type RETURN to exit):dump2.com If file DUMP2.COM exists already, the system asks: Delete dump2.com? Y Then the system asks for the bounds of memory to be saved: Beginning hex address: 100 Ending hex address: 400 The contents of memory from 100H (Hexadecimal) to 400H is copied to file DUMP2.COM.  ///1SET Syntax: SET [options] SET d: [options] SET filespec [options] Explanation: SET initiates password protection and time stamping of files. It also sets the file and drive attributes Read-Write, Read-Only, DIR and SYS. It lets you label a disk and password protect the label. To enable time stamping of files, you must first run INITDIR to format the disk directory. ///2Label Syntax: SET {d:} [NAME=labelname.typ] SET [PASSWORD=password] SET [PASSWORD= ///3Examples A>SET [NAME=DISK100] Labels the disk on the default drive as DISK100. A>SET [PASSWORD=SECRET] Assigns SECRET to the disk label. A>SET [PASSWORD= Nullifies the existing password. ///2Passwords SET [PROTECT=ON] SET [PROTECT=OFF] SET filespec [PASSWORD=password] SET filespec [PROTECT=READ] SET filespec [PROTECT=WRITE] SET filespec [PROTECT=DELETE] SET filespec [PROTECT=NONE] SET filespec [attribute-options] ///3Modes Password Protection Modes Mode Protection READ The password is required for reading, copying writing, deleting or renaming the file. WRITE The password is required for writing, deleting or renaming the file. You do not need a password to read the file. DELETE The password is only required for deleting or renaming the file. You do not need a password to read or modify the file. NONE No password exists for the file. If a password password exists, this modifier can be used to delete the password. ///2Attributes RO sets the file attribute to Read-Only. RW sets the file attribute to Read-Write. SYS sets the file attribute to SYS. DIR sets the file attribute to DIR. ARCHIVE=OFF means that the file has not been backed up (archived). ARCHIVE=ON means that the file has been backed up (archived). The Archive attribute can be turned on by SET or by PIP when copying a group of files with the PIP [A] option. SHOW and DIR display the Archive option. F1=ON|OFF turns on or off the user-definable file attribute F1. F2=ON|OFF turns on or off the user-definable file attribute F2. F3=ON|OFF turns on or off the user-definable file attribute F3. F4=ON|OFF turns on or off the user-definable file attribute F4. ///3Examples SET [PROTECT=ON] Turns on password protection for all the files on the disk. ' You must turn on password protection before you can assign passwords to files. SET [PROTECT=OFF] Disables password protection for the files on your disk. A>SET MYFILE.TEX [PASSWORD=MYFIL] MYFIL is the password assigned to file MYFILE.TEX. B>SET *.TEX [PASSWORD=SECRET, PROTECT=WRITE] Assigns the password SECRET to all the TEX files on drive B. Each TEX file is given a WRITE protect mode to prevent unauthorized editing. A>SET MYFILE.TEX [RO SYS] Sets MYFILE.TEX to Read-Only and SYStem. ///2Default A>SET [DEFAULT=dd] Instructs the system to use dd as a password if you do not enter a password for a password-protected file. ///2Time-Stamps Syntax: SET [CREATE=ON] SET [ACCESS=ON] SET [UPDATE=ON] Explanation: The above SET commands allow you to keep a record of the time and date of file creation and update, or of the last access and update of your files. ///3Options [CREATE=ON] turns on CREATE time stamps on the disk in the default or specified drive. To record the creation time of a file, the CREATE option must be turned on before the file is created. [ACCESS=ON] turns on ACCESS time stamps on the disk in the default or specified drive. ACCESS and CREATE options are mutually exclusive; only one can be in effect at a time. If you turn on the ACCESS time stamp on a disk that previously had CREATE time stamp, the CREATE time stamp is automatically turned off. [UPDATE=ON] turns on UPDATE time stamps on the disk in the default or specified drive. UPDATE time stamps record the time the file was last modified. ///3Examples A>SET [ACCESS=ON]  A>SET [CREATE=ON,UPDATE=ON] ///2Drives Syntax: SET {d:} [RO] SET {d:} [RW] Example: A>SET B: [RO] Sets drive B to Read-Only. ///1SETDEF Syntax: SETDEF { d: {,d: {,d: {,d:}}}} {[ TEMPORARY = d: ] | [ ORDER = (typ {,typ}) ]} SETDEF [DISPLAY | NO DISPLAY] SETDEF [PAGE | NOPAGE] Explanation: SETDEF allows the user to display or define up to four drives for the program search order, the drive for temporary files, and the file type search order. The SETDEF definitions affect only the loading of programs and/or execution of SUBMIT (SUB) files. SETDEF turns on/off the system Display and Console Page modes. When on, the system displays the location and name of programs loaded or SUBmit files executed, and stops after displaying one full console screen of information. ///2Examples A>SETDEF  Displays current SETDEF parameters. A>SETDEF [TEMPORARY=C:] Sets disk drive C as the drive to be used for temporary files. A>SETDEF C:,* Tells the system to search for a program on drive C, then, if not found, search for it on the default drive. A>SETDEF [ORDER=(SUB,COM)] Instructs the system to search for a SUB file to execute. If no SUB file is found, search for a COM file. A>SETDEF [DISPLAY] Turns on the system display mode. Henceforth, the system displays the name and location of programs loaded or submit files executed. A>SETDEF [NO DISPLAY] Turns off the system Display mode. ///1SHOW Syntax: SHOW {d:}{[SPACE |LABEL |USERS |DIR |DRIVE]} Explanation: The SHOW command displays the following disk drive information: Access mode and the amount of free disk space Disk label Current user number and Number of files for each user number on the disk Number of free directory entries for the disk Drive characteristics ///2Examples A>SHOW A>SHOW [SPACE] Instructs the system to display access mode and amount of space left on logged-in drives. A>SHOW B: Show access mode for drive B and amount of space left on drive B. A>SHOW B:[LABEL] Displays label information for drive B. A>SHOW [USERS] Displays the current user number and all the users on drive A and the corresponding number of files assigned to them. A>SHOW C:[DIR] Displays the number of free directory entries on drive C. A>SHOW [DRIVE] Displays the drive characteristics of drive A. ///1SID Syntax: SID {pgm-filespec} {,sym-filespec} Explanation: The SID symbolic debugger allows you to monitor and test programs developed for the 8080 microprocessor. SID supports real-time breakpoints, fully mo(nitored execution, symbolic disassembly, assembly, and memory display and fill functions. SID can dynamically load SID utility programs to provide traceback and histogram facilities. ///2Commands Command Meaning As (Assemble) Enter assembly language statements s is the start address Cs{b{,d}} (Call) Call to memory location from SID s is the called address b is the value of the BC register pair d is the value of the DE register pair D{W}{s}{,f} (Display) Display memory in hex and ASCII W is a 16-bit word format s is the start address f is the finish address Epgm-filespec (Load) Load program and symbol table {,sym-filespec} for execution E*sym-filespec (Load) Load a symbol table file Fs,f,d (Fill) Fill memory with constant value s is the start address f is the finish address d is an eight-bit data item G{p}{,a{,b}} (Go) Begin Execution p is a start address a is a temporary breakpoint H (Hex) Displays all symbols with addresses in Hex H.a Displays hex, decimal, and ASCII values of a where a is a symbolic expression Ha,b Computes hex sum and difference of a and b where  a and b are symbolic expressions Icommand tail (Input) Input CCP command line L{s}{,f} (List) List 8080 mnemonic instructions s is the start address f is the finish address Ms,h,d (Move) Move Memory Block s is the start address h is the high address of the block d is the destination start address P{p{,c}} (Pass) Pass point set, reset, and display p is a permanent breakpoint address c is initial value of pass counter Rfilespec{,d} (Read) Read Code/Symbols d is an offset to each address S{W}s (Set) Set Memory Values s is address where value is sent W is 16 bit word T{n{,c}} (Trace) Trace Program Execution n is the number of program steps c is the utility entry address. T{W}{n{,c}} (Trace) Trace Without Call W instructs SID not to trace subroutines n is the number of program steps c is the utility entry address U{W}{n{,c}} (Untrace) Monitor Execution without Trace n is the number of program steps c is the utility entry address W instructs SID not to trace subroutines V (Value) Display the value of the next available location in memory  (NEXT), the next location after the largest file read in (MSZE), the current value of the Program counter (PC), and the address of the end of available memory (END) Wfilespec,s,f (Write) Write the contents of a contiguous block of memory to filespec. f is finish address X{f}{r} (Examine) Examine/alter CPU state. f is flag bit C,Z,M,E or I. r is register A,B,D,H,S or P. ///2Examples A>SID CP/M 3 loads SID from drive A into memory. SID displays the # prompt when it is ready to accept commands. A>B:SID SAMPLE.HEX CP/M 3 loads SID and the program file SAMPLE.HEX into memory from drive B. ///2Utilities SID u(tilities, HIST.UTL and TRACE.UTL are special programs that operate with SID to provide additional debugging facilities. The mechanisms for system initialization, data collection, and data display are described in the CP/M SID User's Guide. The HIST utility creates a histogram (bar graph) showing the relative frequency of execution of code within selected program segments of the test program. The HIST utility allows you to monitor those sections of code that execute most frequently. The TRACE utility obtains a backtrace of the instructions that led to a particular breakpoint address in a program under test. You can collect the addresses of up to 256 instructions between pass points in U or T modes. ///1SUBMIT Syntax: SUBMIT {filespec} {argument} ... {argument} Explanation: The SUBMIT command lets you execute a group (batch) of commands from a SUBmit file (a file with filetype of SUB). ///2Subfile The SUB file can contain the following types of lines: Any valid CP/M 3 command Any valid CP/M 3 command with SUBMIT parameters ($0-$9) Any data input line Any program input line with parameters ($0 to $9) The command line cannot exceed 135 characters. The following lines illustrate the variety of lines which may be entered in a SUB file: DIR DIR *.BAK MAC $1 $$$4 PIP LST:=$1.PRN[T$2 $3 $5] DIR *.ASM PIP SUBMIT A>SUBMIT SUBA A>SUBMIT AA ZZ SZ A>SUBMIT B:START DIR E: ///2PROFILE.SUB Everytime you power up or reset your computer, CP/M 3 looks for a special SUBmit file named PROFILE.SUB to execute. If it does not exist, CP/M 3 resumes normal operation. If the PROFILE.SUB file exists, the system executes the commands in the file. This file is convenient to use if you regularly execute a set of commands before you do your regular session on the computer. ///1TYPE Syntax: TYPE {filespec {[ PAGE | NOPAGE ]}} Explanation: The TYPE command displays the contents of an ASCII character file on your screen. [PAGE] Causes the console listing to be displayed in paged mode; i.e., stop automatically after listing n lines of text, where n normally defaults to 24 lines per page. [NOPAGE] Turns off Console Page Mode and continuously displays a typed file on the screen. ///2Examples A>TYPE MYPROG.PLI Displays the contents of the file MYPROG.PLI on your screen. A>TYPE B:THISFILE [PAGE] Displays the contents of the file THISFILE from drive B on your screen twenty four lines at a time. ///1USER Syntax: USER {number} Explanation: The USER command sets the current user number. The disk directory can be divided into distinct groups according to a "User Number." User numbers range from 0 through 15. ///2Examples A>USER Enter User#:5 5A> The current user number is now 5 on drive A. A>USER 3 3A> This command changes the current User Number to 3. ///1XREF Syntax: XREF {d:} filename {$P} Explanation: XREF provides a cross-reference summary of variable usage in a program. XREF requires the .PRN and .SYM files produced by MAC or RMAC for input to the program. The SYM and PRN files must have the same filename as the filename in the XREF command tail. XREF outputs a file of type .XRF. Examples: A>XREF b:MYPROG A>XREF b:MYPROG $P )SPhhP8ͱ HFlh8` nx*l6ǀ3ll8 ~ `4fPp$#`?ٶ4u`Lͮ`eU8kFo&ePJܮwXڮVmfP DJ¯@ pic@Y FՀ3lh #~K6ƀHP&Y)AD24D) #: Id ynјY)AB@h(P&!r7Bi6L@r2L@3%0h(H @P( @P( @P( !Xf. rfi3A R G!`i3N`e9L'#  Cd l [ -"ڴ#+[p[@ ^Ȋ l9O/J7ps[F՛/xFV][^+vz@W ]+z@t"^+zEW Tz@W ^+z@W ^+z@W ^)jcv;cv;cv;cv;cv;cv;cv;cv;cv;cv8-Vx ͡LȆ?쁣@¶CVK'%dm]0p@" _2lR{6݁0Xw< M"0xʄGAD"!< "Ce6LgA!@r6а0 f a0 f f'/v{BH»@Y{La0`5;l:JfѰՐ^b1b+$#b1En6`  fԐ1Uum(@8"ͩ bT|Ёnʲc`ݒͣJU;$wgvHea͵@lNd6Xt\ Ux&m&bsgHdf(eaUpW }IGÕAV!I@.1[|V!K'ԙ4yL6#Fr8#* Jj\U +ͣMU9Lg!yI ;6 pfiEt(Ub F$ [@{m8A8upBk g>:N ,:h : Rxf0V jo<- 'i0)d`@!M#%y`ݒ{JI;%%Ydn0ڄ-V<|fހfQfݠ6m]YmrXHk!W!*UC6(9``* º`+`1YbGV ^G< E`Y jV_0H05O#+v: s خSx:q$Of`R(Ԅ.- ͼ{>X0Y""f@VmjYVlUyBlڰ :0rP1nʲLJ5cAU %Ja`ͼ` `@k+T$ dp#t f`C՛V]b3jH6'p0!!*WH|#+x[݀:a v@?쁲[*@`^2K6meRq}Bwٴj^2! ;4f@RzKƬ;ͽ~ â:!~mU0wz@uB@+͵͸ja] mfݠ6ma`Q2XCp̃\Ub4f07 JYM"3i(2GV ew*a q='@DuO#?(W ;k+6 ~PV BP@2!~sǣ+t9erl[U;D +Wx z2AEwvlfuhٶI,V f`CMa 2YMWx!y@b+ó`@ @-U Uw[AF: c6B*OU > 0"[-Ke%ـlDp"[<-Ki%pm@D"[T-Kl%A@mD"[n-Kn%ЉmD"[-?帡`n@D$"[-Ks% {tX$@UaUzjH+{P@3k(3jK4K6`JYG&ml fհmIW, x@(dz¦.U _6J XKUw(A^Od`@F*K՛v#ץf@#sFI'QddEdU%8Q 2P5%@PlP @2 @ ,\??R .(@b Z??L@)S@?@3uT?i` 04?^k e?? ;@@ @@`@`^@@` @`` @` ' @`h@@` @\ @@pP4@P@-ȊȪJq H( )Ѡ ȊH( ȉ)Ѯ` 8)Рd4dT8 =Y@AIVECSՑPddT8 9- @CRDMAԑdddIM2@FXTԐ dDI5@ERDSKQQP`d$du8Q@HOURRSD4T8I)5B@MXTPAM@#_ %Y8IՑP%Y8QSՑP_1=Y8kБ I58}ԑY%9>8TS#b8TԐ#_51Q%>8TQc?IM.8QQPc 1N8PUc_!=UJ8RSM8TT#_5aQApSՑ`SdXa5=Y?BANKG@)jz,u&"a) r\d@uVJe]:"+Hu3D!4e[@UZf0#W' cyu[@@s }\  -k %&z-f_נe]:-0&2STg*Iԓ TE%hIIZ@TRKPP DD 9.@CNTPГS4xA?PDERROГ ct$H =9MR?CONINOӓSĕ5HUa>?AUXIOQ`c4E4MQQI.?STSECP`S$TH]I%Q?LISTSc48Ua%N?AUXOS cDUdIQ 2?MLTIOѓT ChQ%6?BNKSLSh%9QYQJSIOIRVPRTd5D4%hA%=%IZQ5W0Ȁ0 ր `"0x:0H0   a߰at ` aߠV V \+vK ڢY y`h #+k!@U*yT!YXV^unp 7v [ͳ o6΀3@>j!` D "2pH @`*HbjH P`Y>-DH P)rGI`V!j w@E! 0  ( 8ͯ@'%D!6,W+4pV+V@\,%f $Tb+-`Q^YP Uf\`9+ @0px d9ZR{60Z.aA`|/r# f{Xm `\ WB$0N?mT&1͡͹"ͻ"͹"ͻ,Va@ʦDHO31h=,X U4BO31:v%C@C2LIFzYapP"EU0Lrhd#3.PFf7CaʦnTd PI'RHR@T-LKSR )jSU?AUXISSU?AUXOSS$?BNKSLS$H` ?CIc4H ?CIST4H?CONINS4?CONOSc45H0 ?COSTcDUd?DRTBLcEeD$@?FLUSHSXи?INITcD45x?LISTcĕ5E8(?MLTIOCh`?MOVEDT8p?PDERR4x8?READc$45?SCTRNc4E4?STBNKc5DD?STSECc5EE$p?TIMSDX?USERFct$HP?WRITESh?XMOVETE%h͘@AIVECdT8@BNKBFT4$p@CIVECD4H8@COVEC5D$@DBNKDD@DTBLdT8p@MXTPAT$E%h@SECTDE$pCLKIRQd5D4%hDMAIRVdEeE(IVS0RCde35IVS0STde3H PIOIRVe4%h0UNKINTTE%h͘@AIVECdT8@BNKBFTdDH!]I%RHDREADS ^ h6Ȁ06,m ۬ͨ fŀ3pP͸ ͺ pͼ` p1sfEڣ =AmeGj0m ۞-c@WYDC`@Caua`@WG$ lX@V}Zog%e! W0 VmeC^2Ame ڣ <`FYPd ^mx@Xhr[ -eXĠ1-,6a=' Hn-Ӡ u\녒> ˘OaeH |iφ|i{Lu`FmU- pͲ 6p3n60DCmm8`3la ۀͧ$ g'%Fu*r\gt"!'%K""j h)F"\y8$"$$G2B"b:Jtt$")"GG2B"JӠ u\녒> ˘OaeH |iφ|i{Lu`FmU- pͲ 6p3n60DCm TITLE 'ROOT MODULE FOR BULLET CBIOS FOR CP/M 3.0' ; THIS IS THE 'INVARIANT' PORTION OF THE MODULAR CBIOS DISTRIBUTED ; BY DIGITAL RESEARCH FOR 'INFORMATIONAL' PURPOSES ONLY. MODIFICATIONS ; SHOULD BE PERFORMED BY ADDING OR CHANGING EXTERNALLY DEFINED ; MODULES. ; MODIFIED TO UTILIZE Z80 OPCODES AND TO CONFORM TO WAVE MATE ; CONVENTIONS BY DENNIS PAINTER. 1-29-83, 11:02. EDIT 7-24-83 DWP. ; COPYRIGHT 1982, DIGITAL RESEARCH, INC. ; P.O. BOX 579, PACIFIC GROVE CA 93950 TRUE EQU -1 FALSE EQU NOT TRUE DEBUG EQU FALSE IF DEBUG EXTRN SDM ENDIF M80 EQU true ; SELECT PROPER ASSEMBLER IF M80 .Z80 .SFCOND ; DON'T LIST FALSE CONDITIONALS ELSE LIST NOCOND ENDIF CR EQU 13 LF EQU 10 BELL EQU 7 CTLQ EQU 'Q'-'@' CTLS EQU 'S'-'@' MB$XONXOFF EQU 00010000B ; XON/XOFF PROTOCOL ENABLED JPOP EQU 0C3H ; JUMP OPCODE CCP EQU 100H ; LOAD ADDRESS OF CCP IF M80 CSEG ELSE REL ; EQUIVALENT TO CSEG IN RMAC ENDIF ; VARIABLES IN SYSTEM DATA PAGE: E*XTRN @COVEC,@CIVEC,@AOVEC ; SOME I/O REDIRECTION VECTORS EXTRN @AIVEC,@LOVEC ; ECTETRA EXTRN @MXTPA ; MAX TPA IN USER BANK EXTRN @BNKBF ; COMMON 128 BYTE BUFFER ; INITIALIZATION: EXTRN ?INIT ; GENERAL INITIALIZATION EXTRN ?LDCCP,?RLCCP ; LOAD & RELOAD CCP ; USER DEFINED CHARACTER I/O ROUTINES:" EXTRN ?CI,?CO,?CIST,?COST ; EACH TAKE DEVICE EXTRN ?CINIT ; (RE) INITIALIZE DEVICE EXTRN @CTBL ; PHYSICAL CHARACTER ; DISK COMMUNICATION DATA ITEMS: EXTRN @DTBL ; TABLE OF POINTERS ENTRY @ADRV,@RDRV,@TRK,@SECT ; PARAMETERS FOR DISK ENTRY @DMA,@DBNK,@CNT ; " " " ; MEMORY CONTROL: ENTRY @CBNK ; CURRENT BANK EXTRN ?XMOVE,?MOVE ; SELECT MOVE BANK EXTRN ?BANK ; SELECT CPU BANK ; CLOCK SUPPORT: EXTRN ?TIME ; SIGNAL TIME OPERATIN ; GENERAL UTILITY ROUTINES: ENTRY ?PMSG,?PDEC ; PRINT MESSAGE, PRINT NUMBER ENTRY ?PDERR ; PRINT BIOS DISK ERROR MESSAGE ; EXTERNAL NAMES FOR BIOS ENTRY POINTS ENTRY ?BOOT,?WBOOT,?CONST,?CONIN,?CONO,?LIST,?AUXO,?AUXI ENTRY ?HOME,?SLDSK,?STTRK,?STSEC,?STDMA,?READ,?WRITE ENTRY ?LISTS,?SCTRN ENTRY ?CONOS,?AUXIS,?AUXOS,?DVTBL,?DEVIN,?DRTBL ENTRY ?MLTIO,?FLUSH,?MOV,?TIM,?BNKSL,?STBNK,?XMOV ; EXTERNAL NAME FOR USERF FUNCTIONS: EXTRN ?USERF ; LOCATION OF INTERRUPT VECTORS: ENTRY INTVTR,SIOIRV,DMAIRV,CTCIRV,PIOIRV ; LOCATION OF INTERRUPT HANDLERS IS EXTERNAL: EXTRN IVS0XT,IVS0ST,IVS0RC,IVS0SP EXTRN CLKIRQ,UNKINT IF M80 PAGE ELSE FORM ENDIF ;****************************************************************** ;* JUMP VECTORS & INTERRUPT VECTORS MUST BE IN COMMON MEMORY ;****************************************************************** ; ALL BIOS ROUTINES ARE INVOKED BY CALLING ; THESE ENTRY POINTS. ?BOOT: JP BOOT ; INITIAL ENTRY ON COLD START ?WBOOT: JP WBOOT ; REENTRY ON PROGRAM EXIT, WARM START ?CONST: JP CONST ; RETURN CONSOLE INPUT STATUS ?CONIN: JP CONIN ; RETURN CONSOLE INPUT CHARACTER ?CONO: JP CONOUT ; SEND CONSOLE OUTPUT CHARACTER ?LIST: JP LIST ; SEND LIST OUTPUT CHARACTER ?AUXO: JP AUXOUT ; SEND AUXILLIARY OUTPUT CHARACTER ?AUXI: JP AUXIN ; RETURN AUXILLIARY INPUT CHARACTER ?HOME: JP HOME ; SET DISKS TO LOGICAL HOME ?SLDSK: JP SELDSK ; SELECT DISK DRIVE, RETURN DPB ?STTRK: JP SETTRK ; SET DISK TRACK ?STSEC: JP SETSEC ; SET DISK SECTOR ?STDMA: JP SETDMA ; SET DISK I/O MEMORY ADDRESS ?READ: JP READ ; READ PHYSICAL BLOCK(S) ?WRITE: JP WRITE ; WRITE PHYSICAL BLOCKS(S) ?LISTS: JP LISTST ; RETURN LIST DEVICE STATUS ?SCTRN: JP SECTRN ; TRANSLATE LOGICAL TO PHYSICAL SECTOR ?CONOS: JP CONOST ; RETURN CONSOLE OUTPUT STATUS ?AUXIS: JP AUXIST ; RETURN AUX INPUT STATUS ?AUXOS: JP AUXOST ; RETURN AUX OUTPUT STATUS ?DVTBL: JP DEVTBL ; RETURN ADDRESS OF DEVICE DEF TABLE ?DEVIN: JP ?CINIT ; CHANGE BAUD RATE OF DEVICE ?DRTBL: JP GETDRV ; RETURN ADDRESS OF DISK DRIVE TABLE ?MLTIO: JP MULTIO ; BLOCK MOVE MEMORY TO MEMORY ?FLUSH: JP FLUSH ; FLUSH BIOS MAINTAINED DISK CACHING ?MOV: JP ?MOVE ; BLOCK MOVE MEMORY TO MEMORY ?TIM: JP ?TIME ; SIGNAL TIME AND DATE OPERATION ?BNKSL: JP BNKSEL ; SELECT BANK FOR CODE EXECUTION AND ?STBNK: JP SETBNK ; SELECT DIFFERENT BANK FOR DISK I/O ?XMOV: JP ?XMOVE ; SET SOURCE AND DESTINATION BANKS FOR JP ?USERF ; SYSTEM IMPLEMENTOR VECTOR JP NULLOP ; RESERVED FOR FUTURE EXPANSION JP NULLOP ; DITTO IF M80 PAGE ELSE FORM ENDIF ;******************************************************** ;* * ;* INTERRUPT VECTORS * ;* * ;* IMPORTANT -- Z80 MODE 2 INTERRUPT OPERATION * ;* REQURES THAT ALL OF THESE VECTORS RESIDE IN * ;* THE SAME 256-BYTE MEMORY PAGE. * ;* * ;******************************************************** DS 1 ; place holder to align vectors INTVTR EQU $ ; INTERRUPT VECTORS PIOIRV EQU $ ; PIO BASE INTERRUPT VECTOR ; MUST FALL ON A MULTIPLE OF 4 DEFW UNKINT DEFW UNKINT ; PIO PORT B VECTOR? CTCIRV EQU $ ; CTC BASE INTERRUPT VECTOR ; MUST FALL ON A MULTIPLE OF 8 DEFW UNKINT ; CHANNEL 0 VECTOR DEFW UNKINT ; CHANNEL 1 VECTOR DEFW UNKINT ; CHANNEL 2 VECTOR DEFW CLKIRQ ; CHANNEL 3 VECTOR SIOIRV EQU $ ; DART BASE INTERRUPT VECTOR ; MUST FALL ON A MULTIPLE OF 16 DEFW UNKINT ; CHNL B XMIT BUFFER EMPTY DEFW UNKINT ; CHNL B EXTERNAL/STATUS CHANGE DEFW UNKINT ; CHNL B RECEIVE BUFFER FULL DEFW UNKINT ; CHNL B SPECIAL RECEIVE COND DEFW IVS0XT ; CHNL A XMIT BUFFER EMPTY DEFW IVS0ST ; CHNL A EXTERNAL/STATUS CHANGE DEFW IVS0RC ; CHNL A RECEIVE BUFFER FULL DEFW IVS0SP ; CHNL A SPECIAL RECEIVE COND DMAIRV EQU $ ; DMA BASE INTERRUPT VECTOR ; MUST FALL ON A MULTIPLE OF 8 DEFW UNKINT ; INT ON READY. DEFW UNKINT ; INT ON MATCH. DEFW UNKINT ; INT ON END OF BLOCK. DEFW UNKINT ; INT ON MATCH & END OF BLOCK. IF M80 PAGE ELSE FORM ENDIF ; BOOT ; INITIAL ENTRY POINT FOR SYSTEM STARTUP IF M80 DSEG ELSE DATA ; PLACE CODE IN BDOS/BIOS BANK ENDIF BOOT: IF DEBUG CALL SDM ; +CALL SYSTEM DEBUGGER ELSE NOP NOP NOP ENDIF LD SP,BOOT$STACK LD A,0 ; SELECT BANK ZERO CALL ?BNKSL LD C,15 ; INITIALIZE ALL 16 CHARACTER DEVICES C$INIT$LOOP: PUSH BC CALL ?CINIT ; INITIALIZE CHARACTER DEVICES POP BC DEC C JP P,C$INIT$LOOP CALL ?INIT ; INITIALIZE OTHER DEVICES LD BC,16*256+0 LD HL,@DTBL ; INIT ALL 16 LOGICAL DEVICES D$INIT$LOOP: PUSH BC ; SAVE COUNT AND ABS DRIVE LD E,(HL) INC HL LD D,(HL) ; GET ADDR DPH INC HL LD A,E ; CK IF DRIVE EXISTS OR D JR Z,D$INIT$NEXT ; B/ IF NULL, NO DRIVE PUSH HL EX DE,HL DEC HL DEC HL LD A,(HL) ; GET RELATIVE NO LD (@RDRV),A LD A,C LD (@ADRV),A DEC HL LD D,(HL) DEC HL LD E,(HL) EX DE,HL CALL IPCHL POP HL ; RESTORE DPH POINTER D$INIT$NEXT: POP BC ; RESTORE COUNT VALUE INC C ; BUMP DRIVE # DJNZ D$INIT$LOOP ; DO NEXT DPH POINTER JP BOOT$1 IF M80 CSEG ELSE REL ENDIF BOOT$1: CALL SET$JUMPS CALL ?LDCCP ; FETCH CCP.COM JP CCP ; EXECUTE IT. ; WBOOT ; ENTRY FOR SYSTEM RESTARTS WBOOT: LD SP,BOOT$STACK CALL SET$JUMPS ; INITIALIZE PAGE ZERO CALL ?RLCCP ; RELOAD CCP JP CCP ; EXECUTE IT. SET$JUMPS: LD A,1 ; SELECT BANK 1 (USERS) CALL ?BNKSL LD A,JPOP ; GET JP OPCODE LD HL,?WBOOT ; WARM BOOT ENTRY POINT LD (0),A ; CBIOS WARM START ENTRY LD (1),HL LD HL,(@MXTPA) ; BDOS ENTRY POINT LD (5),A LD (6),HL RET DS 64 BOOT$STACK EQU $ ; DEVTBL ; RETURN ADDRESS OF CHARACTER DEVICE TABLE DEVTBL: LD HL,@CTBL ; NULLOP ; A SUBROUTINE RETURN IN COMMON MEMORY NULLOP: RET ; GETDRV ; RETURN ADDRESS OF DRIVE TABLE GETDRV: LD HL,@DTBL RET ; CONOUT ; CONSOLE OUTPUT. DISPATCH CHAR IN (C) TO ALL ; SELECTED DEVICES. CONOUT: LD HL,(@COVEC) ; GET CONSOLE OUTPUT BIT VECTOR JR OUT$SCAN ; AUXOUT ; AUXILLIARY OUTPUT. DISPATCH CHAR IN (C) TO ALL ; SELECTED DEVICES. AUXOUT: LD HL,(@AOVEC) ; GET AUX OUTPUT BIT VECTOR JR OUT$SCAN ; LIST ; LIST OUTPUT. DISPATCH CHAR IN (C) TO ALL ; SELECTED DEVICES. LIST: LD HL,(@LOVEC) ; GET LIST OUTPUT BIT VECTOR ; AND DO OUT$SCAN OUT$SCAN: LD B,0 ; START WITH DEVICE 0. CO$NEXT: ADD HL,HL ; SHIFT OUT NEXT BIT JR NC,NO$OUT$DEV PUSH HL ; SAVE VECTOR PUSH BC ; COUNT & CHAR CO$OUT$RDY: CALL COSTER OR A ; DEVICE READY? JR Z,CO$OUT$RDY ; B/ NO. POP BC ; COPY CHARACTER BACK TO (C) PUSH BC ; AND RESTORE ON STACK CALL ?CO ; IF DEVICE IS SELECTED, PRINT CHAR POP BC ; COUNT & CHAR POP HL ; BIT VECTOR NO$OUT$DEV: INC B ; NEXT DEVICE NUMBER LD A,H ; TEST IF ANY DEVICES LEFT OR L JR NZ,CO$NEXT ; B/ YES RET ; CONOST ; CONSOLE OUTPUT STATUS. RETURN TRUE IF ALL ; SELECTED CONSOLE OUTPUT DEVICES ARE READY. CONOST: LD HL,(@COVEC) ; GET CONSOLE OUTPUT BIT VECTOR JR OST$SCAN ; AUXOST ; AUXILIARY OUTPUT STATUS. RETURN TRUE IF ALL ; SELECTED AUX OUTPUT DEVICES ARE READY. AUXOST: LD HL,(@AOVEC) ; GET AUX OUTPUT BIT VECTOR JR OST$SCAN ; LISTST ; LIST OUTPUT STATUS. RETURN TRUE IF ALL ; SELECTED LIST OUTPUT DEVICES ARE READY. LISTST: LD HL,(@LOVEC) ; GET LIST OUTPUT BIT VECTOR. OST$SCAN: LD B,0 ; START WITH DEVICE 0 COS$NEXT: ADD HL,HL ; CHECK NEXT BIT OF VECTOR. PUSH HL ; SAVE THE VECTOR PUSH BC ; SAVE COUNT & CHARACTER. LD A,-1 ; ASSUME DEVICE READY CALL C,COSTER ; CK STATUS IF DEVICE SELECTED POP BC ; RESTORE COUNT & CHARACTER POP HL ; AND BIT VECTOR. OR A ; TEST IF DEVICE READY. RET Z ; IF ALL NOT READY, RETURN FALSE. INC B ; NEXT DEVICE LD A,H ; SEE IF ANY MORE SELECTED DEVICES OR L JR NZ,COS$NEXT OR 0FFH ; ALL SELECTED DEVICES READY RET ; RETURN TRUE ; CHECK FOR OUTPUT DEVICE READY, INCLUDING XON/XOFF SUPPORT. COSTER: LD L,B ; CONVERT DEVICE NUMBER TO 16 BITS LD H,0 PUSH HL ; SAVE A COPY ADD HL,HL ; OFFSET INTO DEVICE TABLE ADD HL,HL ADD HL,HL LD DE,@CTBL+6 ; TO GET ADDRESS OF MODE BYTE ADD HL,DE LD A,(HL) ; GET MODE BYTE AND MB$XONXOFF ; TEST FOR XON/XOFF PROTOCOL POP HL ; RESTORE DEVICE NUMBER JP Z,?COST ; IF NOT XON/XOFF DEVICE, GET STATUS LD DE,XOFFLIST ADD HL,DE LD C,0 ; FLAG STATUS FOR ^C, ^S, ^Q ONLY CALL CISTL LD A,(HL) CALL NZ,CIL CP CTLQ JR NZ,NOT$Q LD A,-1 ; SET FLAG READY NOT$Q: CP CTLS ; SEE IF CTL-S JR NZ,NOT$S ; B/ NOT LD A,0 ; CLEAR FLAG NOT$S: LD (HL),A ; SAVE THE FLAG CALL COST1 ; GET ACTUAL OUTPUT STATUS AND (HL) ; AND MASK WITH XON/XOFF FLAG RET ; AND RETURN AS STATUS CISTL: ; GET INPUT STATUS WITH (BC) & (HL) PUSH BC PUSH HL CALL ?CIST POP HL POP BC OR A RET COST1: ; GET OUTPUT STATUS, SAVING (BC) & (HL) PUSH BC PUSH HL CALL ?COST POP HL POP BC OR A RET CIL: ; GET INPUT SAVING (BC) & (HL) PUSH BC PUSH HL CALL ?CI POP HL POP BC RET ; CONST ; CONSOLE INPUT STATUS. RETURN TRUE IF ANY SELECTED ; CONSOLE INPUT DEVICE HAS AN AVAILABLE CHARACTER. CONST: LD HL,(@CIVEC) ; GET CONSOLE INPUT BIT VECTOR JR IST$SCAN ; AUXIST ; AUXILIARY I+NPUT STATUS. RETURN TRUE IF ANY SELECTED ; AUX INPUT DEVICE HAS AN AVAILABLE CHARACTER. AUXIST: LD HL,(@AIVEC) ; GET AUX INPUT BIT VECTOR IST$SCAN: LD BC,0 ; START WITH DEVICE 0 ; CREG = 0 = FLAG, STATUS CALL ONLY CIS$NEXT: XOR A ; ASSUME DEVICE NOT READY ADD HL,HL ; SHIFT A BIT OUT CALL C,CISTL ; CK STATUS OF THIS DEVICE OR A ; IF ANY READY RETURN TRUE. RET NZ INC B ; NEXT DEVICE NUMBER. LD A,H ; SEE IF ANY MORE SELECTED DEVICES OR L JR NZ,CIS$NEXT XOR A ; ALL SELECTED WERE NOT READY, FALSE RET ; CONIN ; CONSOLE INPUT. RETURN CHARACTER FROM FIRST READY ; CONSOLE DEVICE. CONIN: LD HL,(@CIVEC) ; GET CONSOLE BIT VECTOR JR IN$SCAN ; AUXIN ; AUXILIARY INPUT. RETURN CHARACTER FROM FIRST ; READY AUX INPUT DEVICE AUXIN: LD HL,(@AIVEC) ; GET AUX BIT VECTOR IN$SCAN: PUSH HL ; SAVE BIT VECTOR LD B,0 ; START WITH DEVICE 0 LD C,-1 ; CREG = FF = STATUS CALL FOR INPUT CI$NEXT: XOR A ; ASSUME NO CHARACTER ADD HL,HL ; SHIFT A BIT OUT CALL C,CISTL ; SEE IF DEVICE HAS CHARACTER OR A ; TEST RESULT JR NZ,CI$RDY ; B/ DEVICE HAS CHARACTER INC B ; NO CHAR, TEST NEXT DEVICE LD A,H OR L JR NZ,CI$NEXT ; GET NEXT????? POP HL ; RECOVER BIT VECTOR JR IN$SCAN ; LOOP UNTIL WE GET A CHARACTER CI$RDY: POP HL ; DISCARD BIT VECTOR JP ?CI ; GET INPUT FROM DEVICE # IN B. IF M80 PAGE ELSE FORM ENDIF ; UTILITY SUBROUTINES: IPCHL: ; VECTORED CALL POINT JP (HL) ?PMSG: ; PRINT MESSAGE @(HL) UP TO A NULL LD A,(HL) ; GET NEXT MESSAGE BYTE OR A ; IS IT NULL? RET Z ; YES, RETURN PUSH HL ; SAVE REGISTERS PUSH DE PUSH BC LD C,A ; CALL CONOUT WITH CHAR IN (C) CALL ?CONO POP BC POP DE POP HL INC HL ; ADVANCE MESSAGE POINTER JR ?PMSG ; LOOP BACK & LOOK FOR END ?PDEC: ; PRINT BINARY NUMBER 0-65535 FROM(HL) LD BC,TABLE10 LD DE,-10000 NEXT: LD A,'0'-1 PDECL: PUSH HL INC A ADD HL,DE JR NC,STOPLOOP INC SP INC SP JR PDECL STOPLOOP: PUSH DE PUSH BC LD C,A CALL ?CONO POP BC POP DE NEXTDIGIT: POP HL LD A,(BC) LD E,A INC BC LD A,(BC) LD D,A INC BC LD A,E OR D JR NZ,NEXT RET TABLE10: DW -1000,-100,-10,-1,0 ?PDERR: ; PRINT DRIVE ERRRO LD HL,DRIVE$MSG CALL ?PMSG LD A,(@ADRV) ADD A,'A' LD C,A CALL ?CONO LD HL,TRACK$MSG CALL ?PMSG LD HL,(@TRK) CALL ?PDEC LD HL,SECTOR$MSG CALL ?PMSG LD HL,(@SECT) CALL ?PDEC RET ; BNKSEL ; BANK SELECT. SELECT CPU BANK FOR EXECUTION BNKSEL: LD (@CBNK),A ; SAVE CURRENT BANK JP ?BANK XOFFLIST: DB -1,-1,-1,-1,-1,-1,-1,-1 DB -1,-1,-1,-1,-1,-1,-1,-1 IF M80 PAGE ELSE FORM ENDIF ;**************************************** ;* * ;* COMMON DISK DRIVER CODE * ;* * ;* THIS CODE IS INDEPENDENT * ;* OF THE DISK DEVICE. IT * ;* SETS UP PARAMETERS AND * ;* ACCESSED THE REQUIRED * ;* DEVICE HANDLER INDIRECTLY * ;* * ;**************************************** IF M80 DSEG ELSE DATA ; FOLLOWING RESIDES IN BANKED MEMORY ENDIF ; SELDSK ; SELECT DISK DRIVE. INVOKE LOGIN PROCEDURE FOR DRIVE ; IF THIS IS FIRST SELECT. ; ENTERS: C = DESIRED DRIVE. ; RETURNS: HL = 0 IF SELECTED DRIVE NON EXISTENT ; HL = @DPH IF SELECTED DRIVE SUPPORTED SELDSK: LD A,C LD (@ADRV),A ; SAVE DRIVE NUMBER IN GLOBAL LD L,C ; CREATE INDEX LD H,0 ADD HL,HL ; DOUBLE DRIVE NUMBER FOR OFFSET LD BC,@DTBL ; POINT TO HEAD OF DRIVE TABLE ADD HL,BC ; INDEX IT LD A,(HL) ; GET SELECTED DPH POINTER INC HL LD H,(HL) LD L,A OR H ; SET FLAGS RET Z ; RETURN IF NO DRIVE LD A,E AND 1 ; TEST IF FIRST SELECT RET NZ ; RETURN IF NOT EX DE,HL LD HL,-2 ; GET RELATIVE ADD HL,DE LD A,(HL) LD (@RDRV),A ; SAVE RELATIVE DRIVE NUMBER LD HL,-6 ; GET LOGIN VECTOR ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A JP (HL) ; CALL DRIVER IF M80 PAGE ELSE FORM ENDIF ; HOME ; HOME SELECTED DRIVE. DO SETTRK (0). HOME: LD BC,0 ; SELECT TRACK ZERO. ; SETTRK ; SET TRACK ADDRESS. ; ENTERS: BC = TRACK ADDRESS ; RETURNS: @TRK = TRACK ADDRESS SETTRK: LD (@TRK),BC ; SAVE TRACK ADDRESS RET ; SETSEC ; SET SECTOR ADDRESS. ; ENTERS: BC = SECTOR ADDRESS ; RETURNS: @SECT = SECTOR ADDRESS SETSEC: LD (@SECT),BC RET IF M80 PAGE ELSE FORM ENDIF ; SETDMA ; SET DIRECT MEMORY ACCESS DISK ADDRESS. ; ENTERS: BD = DMA ADDRESS ; RETURNS: @DMA = DMA ADDRESS ; @DBNK = @CBNK SETDMA: LD (@DMA),BC ; SET GLOBAL DMA ADDRESS LD A,(@CBNK) ; DEFAULT DMA BANK IS CURRENT BANK ; GET CURRENT BANK & DO A SETBNK ; SETBNK ; SET DISK I/O MEMORY BANK. ; ENTERS: A = DISK BANK NUMBER ; RETURNS: @DBNK = DISK BANK NUMBER SETBNK: LD (@DBNK),A ; SET DISK DMA BANK RET ; SECTRN ; SECTOR TRANSLATE. CONVERT LOGICAL SECTOR NUMBER TO ; PHYSICAL SECTOR NUMBER. ; ENTERS: BC = LOGICAL SECTOR NUMBER ; DE = POINTER TO SECTOR XLATE TABLE ; (ZERO IF NO TRANSLATION REQD) ; RETURNS: HL = PHYSICAL SECTOR NUMBER. ; ASSUMES: XLATE TABLE 8 BIT NUMBERS,. SECTRN: LD L,C ; ASSUME NO SECTOR XLATE REQUIRED. LD H,B ; HL = CP/M SECTOR NUMBER (0 RELATIVE) INC HL ; HL = LOGICAL SECTOR # (1 RELATIVE) LD A,D ; CK IF DE = 0 (NO XLATE TABLE) OR E RET Z ; RETURN, NO TRANSLATION REQUIRED DEC HL ; RESTORE ZERO RELATIVE SECTOR NUMBER ADD HL,DE ; FORM TABLE INDEX LD L,(HL) ; TRANSLATE SECTOR NUMBER FROM TABLE LD H,0 ; ASSUMES 8 BIT NUMBERS IN TABLE RET IF M80 PAGE ELSE FORM ENDIF ; READ ; READ PHYSICAL RECORD FROM CURRENTLY SELECTED DISK ; ; ACCESS IS DONE BY ROUTINE IN EXTENDED DISK PARAMETER ; HEADER TABLE (XDPH). READ: LD DE,-8 ; PUT INDEX OFFSET TO READ ROUTINE PUSH DE ; ON TOP OF STACK JR RW$COMMON ; AND ENTER COMMON CODE. ; WRITE ; WRITE PHYSICAL RECORD TO CURRENTLY SELECTED DISK. ; ; ACCESS IS DONE BY ROUTINE IN EXTENDED DISK PARAMETER ; HEADER TABLE (XDPH). ; WRITE: LD DE,-10 ; PUT INDEX TO WRITE ROUTINE ON TOS PUSH DE ; AND USE COMMON CODE. RW$COMMON: LD HL,(@ADRV) ; GET DRIVE CODE LD H,0 ADD HL,HL ; MAKE INDEX LD DE,@DTBL ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A POP DE ; GET ENTRY ADDRESS OFFSET PUSH HL ; SAVE ADDRESS OF TABLE ADD HL,DE ; INDEX TO ROUTINE ENTRY POINT LD A,(HL) INC HL LD H,(HL) LD L,A POP DE ; GET ADDRESS OF XDPH DEC DE DEC DE LD A,(DE) LD (@RDRV),A ; SET RELATIVE DRIVE INC DE ; POINT BACK TO DPH INC DE JP (HL) ; ENTER DISK DRIVER CODE. IF M80 PAGE ELSE FORM ENDIF ; MULTIO ; SET MULTIPLE SECTOR COUNT. ; ENTERS: A = SECTOR COUNT. ; RETURNS: @CNT = MULTIPLE SECTOR COUNT MULTIO: LD (@CNT),A ; SAVE COUNT RET ; FLUSH ; CBIOS DEBLOCKING BUFFER FLUSH. NOT REQUIRED FLUSH: XOR A ; RETURN WITH NO ERROR RET ; DISK ERROR MESSAGE COMPONENTS: DRIVE$MSG: DB CR,LF,BELL,'BIOS ERROR ON ',0 TRACK$MSG: DB ': T-',0 SECTOR$MSG: DB ', S-',0 ; DISK COMMUNICATION DATA ITEMS IF M80 CSEG ELSE REL ; COMMON MEMORY ENDIF @ADRV: DS 1 ; CURRENTLY SELECTED DISK DRIVE # @RDRV: DS 1 ; CONTROLLER RELATIVE DISK DRIVE @TRK: DS 2 ; CURRENT TRACK NUMBER @SECT: DS 2 ; CURRENT SECTOR NUMBER @DMA: DS 2 ; CURRENT DMA ADDRESS @CNT: DB 0 ; RECORD COUNT FOR MULTISECTOR I/O @DBNK: DB 0 ; BANK FOR DMA OPERATIONS @CBNK: DB 0 ; BANK FOR PROCESSOR OPERATION END DIRLBL yd'* !9"1"#2#:Og}**Ip2~w2i#1#":RͶ :O~!ʫ:<2Ž:"2"x2*# O:ļ:<:G>O*# :<t tIw!/>!/>!*6 #:_#:*Y" Y" Y" "*Y"#####Y"##Y"Y"Yz2*Kg"ɯ22!"*DM6:O* 2~ ~ †:<~:2>2:<** "_?:<2>!/:<}:2* ~b W6 y2> # vwm>2>!/ N *~O²+—">2>!/*:< "~G # p *~w#  :, *8*:*8yO:O*}O= ~ w#P^#V#ɷ{ozg |g}oh:<͉̉O<OBKBK$'-*!*DD  $$HD@" @@ $B $$H$H$HH$$! HD$D$D@AD HD$!A"  title 'System Control Block Definition for CP/M3 BIOS' public @civec, @covec, @aivec, @aovec, @lovec, @bnkbf public @crdma, @crdsk, @vinfo, @resel, @fx, @usrcd public @mltio, @ermde, @erdsk, @media, @bflgs public @date, @hour, @min, @sec, ?erjmp, @mxtpa scb$base equ 0FE00H ; Base of the SCB @CIVEC equ scb$base+22h ; Console Input Redirection ; Vector (word, r/w) @COVEC equ scb$base+24h ; Console Output Redirection ; Vector (word, r/w) @AIVEC equ scb$base+26h ; Auxiliary Input Redirection ; Vector (word, r/w) @AOVEC equ scb$base+28h ; Auxiliary Output Redirection ; Vector (word, r/w) @LOVEC equ scb$base+2Ah ; List Output Redirection ; Vector (word, r/w) @BNKBF equ scb$base+35h ; Address of 128 Byte Buffer ; for Banked BIOS (word, r/o) @CRDMA equ scb$base+3Ch ; Current DMA Address ; (word, r/o) @CRDSK equ scb$base+3Eh ; Current Disk (byte, r/o) @VINFO equ scb$base+3Fh ; BDOS Variable "INFO" ; (word, r/o) @RESEL equ scb$base+41h ; FCB Flag (byte, r/o) @FX equ scb$base+43h ; BDOS Function for Error ; Messages (byte, r/o) @USRCD equ scb$base+44h ; Current User Code (byte, r/o) @MLTIO equ scb$base+4Ah ; Current Multi-Sector Count ; (byte,r/w) @ERMDE equ scb$base+4Bh ; BDOS Error Mode (byte, r/o) @ERDSK equ scb$base+51h ; BDOS Error Disk (byte,r/o) @MEDIA equ scb$base+54h ; Set by BIOS to indicate ; open door (byte,r/w) @BFLGS equ scb$base+57h ; BDOS Message Size Flag (byte,r/o) @DATE equ scb$base+58h ; Date in Days Since 1 Jan 78 ; (word, r/w) @HOUR equ scb$base+5Ah ; Hour in BCD (byte, r/w) @MIN equ scb$base+5Bh ; Minute in BCD (byte, r/w) @SEC equ scb$base+5Ch ; Second in BCD (byte, r/w) ?ERJMP equ scb$base+5Fh ; BDOS Error Message Jump ; (word, r/w) @MXTPA equ scb$base+62h ; Top of User TPA ; (address at 6,7)(word, r/o) end - ; CALLVERS program bdos equ 5 ; entry point for BDOS prtstr equ 9 ; print string function vers equ 12 ; get version function cr equ 0dh ; carriage return lf equ 0ah ; line feed org 100h mvi d,5 ; Perform 5 times loop: push d ; save counter mvi c,prtstr lxi d,call$msg ; print call message call bdos mvi c,vers call bdos ; try to get version # ; CALLVERS will intercept mov a,l sta curvers pop d dcr d ; decrement counter jnz loop mvi c,0 jmp bdos call$msg: db cr,lf,'**** CALLVERS **** $' curvers db 0 end ; Dump program, reads input file and displays hex data ; org 100h bdos equ 0005h ;dos entry point cons equ 1 ;read console typef equ 2 ;type function printf equ 9 ;buffer print entry brkf equ 11 ;break key function (true if char ready) openf equ 15 ;file open readf equ 20 ;read function ; fcb equ 5ch ;file control block address buff equ 80h ;input disk buffer address ; ; non graphic characters cr equ 0dh ;carriage return lf equ 0ah ;line feed ; ; file control block definitions fcbdn equ fcb+0 ;disk name fcbfn equ fcb+1 ;file name fcbft equ fcb+9 ;disk file type (3 characters) fcbrl equ fcb+12 ;file's current reel number fcbrc equ fcb+15 ;file's record count (0 to 128) fcbcr equ fcb+32 ;current (next) record number (0 to 127) fcbln equ fcb+33 ;fcb length ; ; set up stack lxi h,0 dad sp ; entry stack pointer in hl from the ccp shld oldsp ; set sp to local stack area (restored at finis) lxi sp,stktop ; read and print successive buffers call setup ;set up input file cpi 255 ;255 if file not present jnz openok ;skip if open is ok ; ; file not there, give error message and return lxi d,opnmsg call err jmp finis ;to return ; openok: ;open operation ok, set buffer index to end mvi a,80h sta ibp ;set buffer pointer to 80h ; hl contains next address to print lxi h,0 ;start with 0000 ; gloop: push h ;save line position call gnb pop h ;recall line position jc finis ;carry set by gnb if end file mov b,a ; print hex values ; check for line fold mov a,l ani 0fh ;check low 4 bits jnz nonum ; print line number call crlf ; ; check for break key call break ; accum lsb = 1 if character ready rrc ;into carry jc finis ;don't print any more ; mov a,h call phex mov a,l call phex nonum: inx h ;to next line number mvi a,' ' call pchar mov a,b call phex jmp gloop ; finis: ; end of dump call crlf lhld oldsp sphl ; stack pointer contains ccp's stack location ret ;to the ccp ; ; ; subroutines ; break: ;check break key (actually any key will do) push h! push d! push b; environment saved mvi c,brkf call bdos pop b! pop d! pop h; environment restored ret ; pchar: ;print a character push h! push d! push b; saved mvi c,typef mov e,a call bdos pop b! pop d! pop h; restored ret ; crlf: mvi a,cr call pchar mvi a,lf call pchar ret ; ; pnib: ;print nibble in reg a ani 0fh ;low 4 bits cpi 10 jnc p10 ; less than or equal to 9 adi '0' jmp prn ; ; greater or equal to 10 p10: adi 'a' - 10 prn: call pchar ret ; phex: ;print hex char in reg a push psw rrc rrc rrc rrc call pnib ;print nibble pop psw call pnib ret ; err: ;print error message ; d,e addresses message ending with "$" mvi c,printf ;print buffer function call bdos ret ; ; gnb: ;get next byte lda ibp cpi 80h jnz g0 ; read another buffer ; ; call diskr ora a ;zero value if read ok jz g0 ;for another byte ; end of data, return with carry set for eof stc ret ; g0: ;r-ead the byte at buff+reg a mov e,a ;ls byte of buffer index mvi d,0 ;double precision index to de inr a ;index=index+1 sta ibp ;back to memory ; pointer is incremented ; save the current file address lxi h,buff dad d ; absolute character address is in hl mov a,m ; byte is in the accumulator ora a ;reset carry bit ret ; setup: ;set up file ; open the file for input xra a ;zero to accum sta fcbcr ;clear current record ; lxi d,fcb mvi c,openf call bdos ; 255 in accum if open error ret ; diskr: ;read disk file record push h! push d! push b lxi d,fcb mvi c,readf call bdos pop b! pop d! pop h ret ; ; fixed message area signon: db 'file dump version 2.0$' opnmsg: db cr,lf,'no input file present on disk$' ; variable area ibp: ds 2 ;input buffer pointer oldsp: ds 2 ;entry sp value from ccp ; ; stack area ds 64 ;reserve 32 level stack stktop: ; end  ; ECHOVERS RSX pstring equ 9 ; string print function cr equ 0dh lf equ 0ah ; ; RSX PREFIX STRUCTURE ; db 0,0,0,0,0,0 ; room for serial number jmp ftest ; begin of program next db 0c3H ; jump dw 0 ; next module in line prev: dw 0 ; previous module remov: db 0ffh ; remove flag set nonbnk: db 0 db 'ECHOVERS' space: ds 3 ftest: ; is this function 12? mov a,c cpi 12 jz begin ; yes - intercept jmp next ; some other function begin: lxi h,0 dad sp ;save stack shld ret$stack lxi sp,loc$stack mvi c,pstring lxi d,test$msg ; print message call next ; call BDOS lhld ret$stack ; restore user stack sphl lxi h,0031h ; return version number = 0031h ret test$msg: db cr,lf,'**** ECHOVERS **** $' ret$stack: dw 0 ds 32 ; 16 level stack loc$stack: end ;*************************************************** ;* * ;* sample random access program for cp/m 3 * ;* * ;*************************************************** org 100h ;base of tpa ; reboot equ 0000h ;system reboot bdos equ 0005h ;bdos entry point ; coninp equ 1 ;console input function conout equ 2 ;console output function pstring equ 9 ;print string until '$' rstring equ 10 ;read console buffer version equ 12 ;return version number openf equ 15 ;file open function closef equ 16 ;close function makef equ 22 ;make file function readr equ 33 ;read random writer equ 34 ;write random wrtrzf equ 40 ;write random zero fill parsef equ 152 ;parse function ; fcb equ 005ch ;default file control block ranrec equ fcb+33 ;random record position ranovf equ fcb+35 ;high order (overflow) byte buff equ 0080h ;buffer address ; cr equ 0dh ;carriage return lf equ 0ah ;line feed ; ;*************************************************** ;* * ;* load SP, set-up file for random access * ;* * ;*************************************************** lxi sp,stack ; ; version 3.1? mvi c,version call bdos cpi 31h ;version 3.1 or better? jnc versok ; bad version, message and go back lxi d,badver call print jmp reboot ; versok: ; correct version for random access mvi c,openf ;open default fcb rdname: lda fcb+1 cpi ' ' jnz opfile lxi d,entmsg call print call parse jmp versok opfile: lxi d,fcb call bdos inr a ;err 255 becomes zero . jnz ready ; ; cannot open file, so create it mvi c,makef lxi d,fcb call bdos inr a ;err 255 becomes zero jnz ready ; ; cannot create file, directory full lxi d,nospace call print jmp reboot ;back to ccp ; ;*************************************************** ;* * ;* loop back to "ready" after each command * ;* * ;*************************************************** ; ready: ; file is ready for processing ; call readcom ;read next command shld ranrec ;store input record# lxi h,ranovf mov m,c ;set ranrec high byte cpi 'Q' ;quit? jnz notq ; ; quit processing, close file mvi c,closef lxi d,fcb call bdos inr a ;err 255 becomes 0 jz error ;error message, retry jmp reboot ;back to ccp ; ;*************************************************** ;* * ;* end of quit command, process write * ;* * ;*************************************************** notq: ; not the quit command, random write? cpi 'W' jnz notw ; ; this is a random write, fill buffer until cr lxi d,datmsg call print ;data prompt mvi c,127 ;up to 127 characters lxi h,buff ;destination rloop: ;read next character to buff push b ;save counter push h ;next destination call getchr ;character to a pop h ;restore counter pop b ;restore next to fill cpi cr ;end of line? jz erloop ; not end, store character  mov m,a inx h ;next to fill dcr c ;counter goes down jnz rloop ;end of buffer? erloop: ; end of read loop, store 00 mvi m,0 ; ; write the record to selected record number mvi c,writer lxi d,fcb call bdos ora a ;error code zero? jnz error ;message if not jmp ready ;for another record ; ; ;******************************************************** ;* * ;* end of write command, process write random zero fill * ;* * ;******************************************************** notw: ; not the quit command, random write zero fill? cpi 'F' jnz notf ; ; this is a random write, fill buffer until cr lxi d,datmsg call print ;data prompt mvi c,127 ;up to 127 characters lxi h,buff ;destination rloop1: ;read next character to buff push b ;save counter push h ;next destination call getchr ;character to a pop h ;restore counter pop b ;restore next to fill cpi cr ;end of line? jz erloop1 ; not end, store character mov m,a inx h ;next to fill dcr c ;counter goes down jnz rloop1 ;end of buffer? erloop1: ; end of read loop, store 00 mvi m,0 ; ; write the record to selected record number mvi c,wrtrzf lxi d,fcb call bdos ora a ;error code zero? jnz error ;message if not jmp ready ;for another record ; ;*************************************************** ;* * ;* end of write commands, process read * ;* * ;*************************************************** notf: ; not a write command, read record? cpi 'R' jnz error ;skip if not ; ; read random record mvi c,readr lxi d,fcb call bdos ora a ;return code 00? jnz error ; ; read was successful, write to console call crlf ;new line mvi c,128 ;max 128 characters lxi h,buff ;next to get wloop: mov a,m ;next character inx h ;next to get ani 7fh ;mask parity jz ready ;for another command if 00 push b ;save counter push h ;save next to get cpi ' ' ;graphic? cnc putchr ;skip output if not pop h pop b dcr c ;count=count-1 jnz wloop jmp ready ; ;***.************************************************ ;* * ;* end of read command, all errors end-up here * ;* * ;*************************************************** ; error: lxi d,errmsg call print jmp ready ; ;*************************************************** ;* * ;* utility subroutines for console i/o * ;* * ;*************************************************** getchr: ;read next console character to a mvi c,coninp call bdos ret ; putchr: ;write character from a to console mvi c,conout mov e,a ;character to send call bdos ;send character ret ; crlf: ;send carriage return line feed mvi a,cr ;carriage return call putchr mvi a,lf ;line feed call putchr ret ; parse: ;read and parse filespec lxi d,conbuf mvi c,rstring call bdos lxi d,pfncb mvi c,parsef call bdos ret ; print: ;print the buffer addressed by de until $ push d call crlf pop d ;new line mvi c,pstring call bdos ;print the string ret ; readcom: ;read the next command line to the conbuf lxi d,prompt call print ;command? mvi c,rstring lxi d,conbuf call bdos ;read command line ; command line is present, scan it mvi c,0 ;start with 00 lxi h,0 ; 0000 lxi d,conlin;command line readc: ldax d ;next command character inx d ;to next command position ora a ;cannot be end of command rz ; not zero, numeric? sui '0' cpi 10 ;carry if numeric jnc endrd ; add-in next digit push psw mov a,c ;value = ahl dad h adc a ;*2 push a ;save value * 2 push h dad h ;*4 adc a dad h ;*8 adc a pop b ;*2 + *8 = *10 dad b pop b adc b pop b ;+digit mov c,b mvi b,0 dad b aci 0 mov c,a jnc readc jmp readcom endrd: ; end of read, restore value in a adi '0' ;command cpi 'a' ;translate case? rc ; lower case, mask lower case bits ani 101$1111b ret ;return with value in chl ; ;*************************************************** ;* * ;* string data area for console messages * ;* * ;*************************************************** badver: db 'sorry, you need cp/m version 3$' nospace: db 'no directory space$' datmsg: db 'type data: $' errmsg: db 'error, try again.$' prompt: db 'next command? $' entmsg: db 'enter filename: $' ; ;*************************************************** ;* * ;* fixed and variable data area * ;* * ;*************************************************** conbuf: db conlen ;length of console buffer consiz: ds 1 ;resulting size after read conlin: ds 32 ;length 32 buffer conlen equ $-consiz ; pfncb: dw conlin dw fcb ; ds 32 ;16 level stack stack: end / TITLE HDDRV.Z80 -- SCSI/WINCHESTER DISK CONTROLLER DRIVER ;********************************************************************** ; ; THIS IS AN UNPUBLISHED WORK WHICH IS THE PROPERTY OF WAVE MATE, INC. ; THIS WORK CONTAINS PROPRIETARY INFORMATION AND IS PROVIDED UNDER A ; CONFIDENTIAL RELATIONSHIP FOR A SPECIFIC PURPOSE. THE RECIPENT, BY ; ACCEPTANCE, ASSUMES CUSTODY THEREOF AND AGREES NOT TO DISCLOSE OR ; TRANSFER THIS WORK IN WHOLE OR IN PART WITHOUT WRITTEN PERMISSION OF ; WAVE MATE, INC.; 14009 S. CRENSHAW BLVD.; HAWTHORNE, CA 90250; USA ; ;********************************************************************** ; Last edit date: 8-3-83 07:48 dwp false equ 0 ; False true equ not false ; True m80 equ true imi5018 equ true ; assemble parameters for selected drve imi5012 equ false if m80 .Z80 .SFCOND else LIST NOCOND endif ; ; Define entry points for XDPBs in DRVTBL module. ; entry hdinit,hdwrit,hdread,hdlgin ; ; Define external data locations. ; extrn @dma,@trk,@sect,@dbnk,@cbnk ; ; Define external subroutines. ; extrn ?bnksl ; ; the data register for the sasi bus is at locations c,d,e,f. ; each input or output to the data port generates an ack pulse ; which is reset by req being deactivated. ; ; the control register for the sasi bus is the pio port a. ; it is setup as follows: ; ; a0 - atn output ; a1 - rst output (reset controller) ; a2 - sel output (select controller) ; a3 - busy input (indicates controller is in command mode) ; a4 - msg input (controller has message) ; a5 - c/d input (command is high, data is low) ; a6 - req input (request bit) ; a7 - i/o input (input is high, output is low) ; equates for sasi interface ; pioactl equ 06h ; pio port a control pioadat equ 04h ; pio port a data sasidat equ 0ch ; sasi data port datain equ sasidat ; Data in port dataout equ sasidat ; Data out port bcon equ pioadat ; Bus control bstat equ pioadat ; Bus status inout equ 7 ; In/out bit (in) req equ 6 ; Request bit (in) comdta equ 5 ; Command/data bit (in) msg equ 4 ; Message bit (in) busy equ 3 ; Busy bit (in) sel equ 2 ; Select bit (out) rst equ 1 ; Reset bit (out) atn equ 0 ; Attention bit (out) ; equates for the XEBEC controller intdiag equ 0e4h ; Controller internal diag ramdiag equ 0e0h ; Controller ram diag tstrdy equ 00h ; Test drive ready intctl equ 0ch ; Initialize controller read equ 08h ; Read a sector write equ 0ah ; Write a sector wsbuf equ 0fh ; Write sector buffer if m80 page else form endif if imi5012 ; equates for the IMI 5012H drive maxcyl equ 306 ; maximum cylinders on drive heads equ 4 ; number heads wrpcmp equ 214 ; IMI manual dtd 19MAR83 rev B page 4-3 ; write precomp cylinder per IMI rwc equ -1 ; reduced write current not reqd stepr equ 00h ; Step rate for seek eccblc equ 11 ; ECC burst length code endif if imi5018 ; equates for the IMI 5018H drive maxcyl equ 306 ; maximum cylinders on drive heads equ 6 ; number heads wrpcmp equ 214 ; IMI manual dtd 19MAR83 rev B page 4-3 ; write precomp cylinder per IMI rwc equ -1 ; reduced write current not reqd stepr equ 00h ; Step rate for seek eccblc equ 11 ; ECC burst length code endif sptrk equ 17 ; 17 sectors per track spcyl equ sptrk * heads ; Sectors per cylinder if m80 page else form endif IF M80 CSEG ELSE REL ; R/W MUST BE IN COMMON endif ; Hdread -- Read a 512 byte sector ; ; input none ; ; output A = 0, z = 1 if no error ; A not zero, z = 0 if error ; hdread: call getcon ; Get controllers attn. ret nz ; error return, controller did not respond ld hl,cmdblk ; Hl --> command block call setadr ; Set addr. into cmdblk ld (hl),read ; Set read command call sndcmd ; Send the command ld hl,(@dma) ; Read into @dma ; stack must be in common to do this! just lucky I guess call setbnk ; Select DMA bank call getdta ; Get sector data call rstbnk ; Restore normal bank ret ; And return ; Hdwrit -- Write a 512 byte sector ; ; input none ; ; output A = 0, z = 1 if no error ; A not zero, z = 0 if error ; hdwrit: call getcon ; Get controllers attn. ret nz ; error return, controller did not respond ld hl,cmdblk ; Hl --> command block call setadr ; Set addr. into cmdblk ld (hl),write ; Set write command call sndcmd ; Send the command ld hl,(@dma) ; Write from @dma ; stack must be in common to do this! just lucky I guess call setbnk ; Select DMA bank call snddta ; Send sector data call rstbnk ; Restore normal bank ret ; And return if m80 page else form endif ; Snddta -- Send data to controller ; ; input HL points to data ; ; output none ; snddta: ld c,dataout ; C = data port sndd1: call wtreq ; wait for controller REQ bit comdta,a ; Check for data mode jr nz,complete ; Command mode -- done outi ; Send a byte jr sndd1 ; Back for another byte ; Getdta -- Get data from controller ; / ; input HL = Data address ; ; output none ; getdta: ld c,datain ; Data input port getd1: call wtreq ; wait for controller REQ bit comdta,a ; Test for command mode jr nz,complete ; Got it -- done here ini ; Get a byte jr getd1 ; Back 'fer more ; Complete -- Process end of SASI transaction ; complete: in a,(datain) ; Get completion status ld c,a ; Save it comp1: call wtreq ; wait for controller REQ in a,(datain) ; Get last byte or a ; Test it for errors jr nz,badbyte ; Error -- non-zero ld a,c ; Get completion status or a ; Check for errors jr nz,badstat ; Got a real error xor a ; Indicate no errors ret ; and return if m80 page else form endif ; ; Error handling ; badstat: badbyte: call getcon ; Get controllers attn ld hl,snsblk ; HL --> Get sense bytes call sndcmd ; Send command ld hl,snsdat ; HL --> sense bytes data call getdta ; Go get the sense bytes ld a,(snsdat) ; Get error code and 03fh ; Isolate error  cp 018h ; Corrected ecc error? jr nz,badb1 ; Nope -- real error! xor a ; Clear flags ret ; and return badb1: ld a,1 ; Indicate error or a ; Set flags ret ; and return ; Senblk -- Get sense bytes command block snsblk: defb 03h ; Request sense bytes defb 0,0,0,0,0 ; The rest are zeros snsdat: defs 4 ; Sense byte data ; Cmdblk -- Command block for controller cmdblk: defb 0,0,0,0 count: defb 1 ; Block count control: defb stepr ; Control byte if m80 page else form endif ; Getcon -- Get controller attention ; getcon: ld hl,8000h ; set a long time out getc1: dec hl ; test for timeout ld a,l or h jr nz,getc2 ; not timed out or 0ffh ; return error ret getc2: in a,(bstat) ; get bus status bit busy,a ; is it busy? jr nz,getc1 ; yes, wait for it to be free ld a,1 out (dataout),a ; Indicate first device xor a set sel,a ; Assert sel and data0 out (bcon),a ; to get attn of controller ld hl,0000h ; set a long time out ckbusy: dec hl ; test for timeout ld a,l or h jr nz,ckbsy1 ; not timed out or 0ffh ; return error ret ckbsy1: in a,(bstat) ; Get bus status bit busy,a ; Check for busy jr z,ckbusy ; Wait xor a out (bcon),a ; Turn off select bit ret ; and return A = 0, Z = 1 ; Sndcmd -- Send command to controller ; ; input: hl = pointer to command block ; ; output: none ; sndcmd: ld c,dataout ; C = data out port sndc1: call wtreq ; wait for controller request bit comdta,a ; Command mode? ret z ; Ret when data is requested bit inout,a ; Output mode? ret nz ; Ret if it wants to send data outi ; Send a command byte jr sndc1 ; Loop back ; ; wtreq - wait for controller request ; wtreq: in a,(bstat) ; Get bus status bit req,a ; Is REQ set? jr z,wtreq ; no, wait ret if m80 page else form endif ; Setbnk -- Switch to DMA bank ; ; input @dbnk = Bank for DMA operation ; @cbnk = Currently selected bank ; ; output none ; setbnk: ld a,(@cbnk) ; Get current bank ld (bnksav),a ; Save it ld a,(@dbnk) ; Get DMA bank call ?bnksl ; Go select it ret ; and return ; Rstbnk -- Restore execution bank ; ; input bnksav = execution bank ; ; output none ; rstbnk: push af ; Save flags ld a,(bnksav) ; Get execution bank call ?bnksl ; Select it pop af ; Restore flags ret ; And return bnksav: defb 0 ; Saved bank number if m80 page else form endif IF M80 DSEG ELSE DATA ; PUT FOLLOWING INTO SYSTEM BANK ENDIF ; Hdlgin -- Hard disk log in routine ; ; input DE points to XDPH, set by BIOSKRNL ; ; output HL points to XDPH if executing on rev E board ; HL contains 0 if not on rev E board ; hdlgin: ex de,hl ; return xdph in register hl ld a,(rvflag) ; make sure this is on rev E board inc a ; test revision flag ret z ; return, no error ld hl,0 ; error return ret if m80 page else form endif ; Setadr -- Set block address into cmdblk ; ; input HL = Address of command block ; @trk = Track number ; @sect = Sector number ; ; output none ; setadr: push ix ; Save IX push hl ; Move HL pop ix ; to IX ld bc,spcyl ; BC = Cylinders/track ld de,(@trk) ; DE = Cylinder number ; Multiply BC * DE --> DE,HL ld a,16 ; Iteration factor ld hl,0 ; Zero product mult1: bit 7,d ; Test next multiplier jp z,mult2 ; Go if zero add hl,bc ; Add multiplicand jp nc,mult2 ; Go if no carry inc de ; Carry to most sig. byte mult2: dec a ; Dec iteration cntr jr z,mult3 ; Done ex de,hl add hl,hl ; Shift DE ex de,hl add hl,hl ; Shift HL jp nc,mult1 ; Go if no carry inc de ; Carry to most sig byte jp mult1 ; Continue mult3: ; HL = Low order address, E = high order ld a,(@sect) ; Get sector number dec a ; Make it zero based ld c,a ; Into c ld b,0 ; Clear high order xor a ; Clear carry bit add hl,bc ; Add in sector number jr nc,mult4 ; No carry -- all done inc de ; Carry -- inc DE mult4:0 ld (ix+1),e ; Set MSB ld (ix+2),h ; Set NSB ld (ix+3),l ; Set LSB push ix pop hl ; Restore cmdblk ptr pop ix ; Restore ix ret ; and return if m80 page else form endif ; Hdinit -- Initilize SASI interface ; ; input none ; ; output A = 0, Z = 1 if no error ; A = 1, Z = 0 if error ; hdinit: ; test for which revision board the software is loaded on ; note: this test should not be done if fddrv is active ld a,0ffh out (18h),a ; write to disk hw control port in a,(19h) ; read hardware status port and 1 ; save bit 0 ld c,a ld a,0 out (18h),a ; see if bit 0 changes in a,(19h) and 1 sub c ; A = FF iff board is rev E ; A = 00 iff board is rev B, C or C1 ld (rvflag),a ; set revision level flag ret z ; done if not rev E board ; Pioinit -- Initialize PIO port A ld a,0cfh out (pioactl),a ; set pio a mode 3 ld a,0f8h out (pioactl),a ; bits 0-2 output, 3-7 input ld a,07h out (pioactl),a ; disable pio interrupts xor a set rst,a ; Set reset bit out (bcon),a ; Reset controller ex de,hl ; Delay a little ex de,hl xor a out (bcon),a ; Lift reset call getcon ; Get controllers attn jr z,hdin0 ; b/ controller responded xor a ; set flag, can't to hard io ld (rvflag),a ret hdin0: ld hl,intcmd ; HL --> command block ld (hl),intdiag ; Controller internal diag call sndcmd ; Send command call snddta ; Check for errors ret nz ; Error return call getcon ; Get controllers attn ld hl,intcmd ; HL --> command block ld (hl),ramdiag ; Controller ram diag call sndcmd ; Send command call snddta ; Check for errors ret nz ; Error return call getcon ; Get controllers attn ld hl,intcmd ; HL --> init cmd block ld (hl),intctl ; Initialize characteristics call sndcmd ; Send command ld hl,intdta ; HL --> init data block call snddta ; Send data ret nz ; Error return hdin1: call getcon ; Get controllers attn ld hl,intcmd ; HL --> command block ld (hl),tstrdy ; Test drive ready call sndcmd ; Send command call snddta ; Check for errors jr nz,hdin1 ; Loop if not ready ret ; Return if drive ready if m80 page else form endif ; Intcmd - Command block to initialize controller intcmd: defb 0 ; Initialize controller defb 0,0,0,0,0 ; The rest are zero ; Intdta -- Data block to initialize controller intdta: defb maxcyl/256 ; MSB of maximum cylinders defb maxcyl-(maxcyl/256)*256 ; LSB defb heads ; number of heads defb rwc/256 ; MSB of reduced write current defb rwc-(rwc/256)*256 ; LSB defb wrpcmp/256 ; MSB of write precomp defb wrpcmp-(wrpcmp/256)*256 ; LSB defb eccblc ; ECC burst length code rvflag: defb 0 ; board revision flag end  TITLE 'DEFAULT CONSOLE BAUD RATE DATA TABLE' ; ; THIS DATA RESIDES IN A DISK FILE NAMED CONBAUD.SYS. UPON COLD ; BOOT THE LOADER SEARCHES FOR A FILE NAMED CONBAUD.SYS AND USES ; THE DATA IN THAT FILE TO INITIALIZE THE CONSOLE DEVICE. ; ; ZILOG COUNTER TIMER (CTC) HARDWARE PORT LOCATIONS: CTC0 EQU 8 ; CTC CHANNEL 0 CTC1 EQU CTC0+1 ; CTC CHANNEL 1 CTC2 EQU CTC1+1 ; CTC CHANNEL 2 CTC3 EQU CTC2+1 ; CTC CHANNEL 3 ; COUNTER TIMER CHANNEL INITIALIZATION CONTROL WORDS: CCCRSET EQU 00000010B ; SOFTWARE CHANNEL RESET ; BIT 1 = RESET CCCINI0 EQU 01000101B ; INIT WORD FOR CHANNEL 0 ; BIT 0 = CONTROL WORD ; BIT 2 = TIME CONSTANT FOLLOWS ; BIT 3 = AUTO TRIGGER ; BIT 5 = PRESCALE 16 (NA FOR COUNTER) ; BIT 6 = COUNTER MODE ; BIT 7 = DISABLE INTERRUPTS CCCINI1 EQU CCCINI0 ; INIT WORD FOR CHANNEL 1 CCCINI2 EQU CCCINI0 ; INIT WORD FOR CHANNEL 2 CCCINI3 EQU 00100101B ; INIT WORD FOR CHANNEL 3 ; BIT 0 = CONTROL WORD ; BIT 2 TIME CONSTANT FOLLOW0S ; BIT 3 = AUTO TRIGGER ; BIT 5 = PRESCALER ; BIT 6 = TIMER MODE ; BIT 7 = ENABLE INTERRUPTS ; COUNTER TIMER CHANNEL TIME CONSTANTS FOR BAUD RATES: CCCTC384 EQU 00000001B ; TIME CONSTANT = 38.4K BAUD*32 CCCTC192 EQU 00000010B ; TIME CONSTANT = 19.2K BAUD*32 CCCTC96 EQU 00000100B ; TIME CONSTANT = 9600 BAUD*32 CCCTC48 EQU 00001000B ; TIME CONSTANT = 4800 BAUD*32 CCCTC24 EQU 00010000B ; TIME CONSTANT = 2400 BAUD*32 CCCTC12 EQU 00100000B ; TIME CONSTANT = 1200 BAUD*32 CCCTC6 EQU 01000000B ; TIME CONSTANT = 600 BAUD*32 CCCTC3 EQU 10000000B ; TIME CONSTANT = 300 BAUD*32 CCCTC1$5 EQU 10000000B ; TIME CONSTANT = 150 BAUD*64 CCCTC1$1 EQU 174 ; TIME CONSTANT = 110 BAUD*64 ; CRT DEFINITIONS: CRTDAT EQU 00H ; DATA PORT CRTSTS EQU CRTDAT+1 ; STATUS PORT CRTCTL EQU CRTSTS ; CONTROL PORT CRTDAV EQU 01H ; RECEIVER DATA AVAILABLE MASK CRTTBE EQU 04H ; TRANSMIT BUFFER EMPTY MASK ; (DART) INITIALIZATION CONSTANT FOR WR0, RESET & REGISTER SELECT. CCSRESET EQU 00011000B ; SOFTWARE CHANNEL RESET ; BIT 1 = SOFTWARE RESET CCSWRSL0 EQU 00010000B ; WRITE REGISTER SELECT #0 CCSWRSL1 EQU 00000001B ; WRITE REGISTER SELECT #1 ; ? I COPIED FROM JRS'S CODE FOR ABOVE CCSWRSL2 EQU 00010010B ; WRITE REGISTER SELECT #2 CCSWRSL3 EQU 00010011B ; WRITE REGISTER SELECT #3 CCSWRSL4 EQU 00010100B ; WRITE REGISTER SELECT #4 CCSWRSL5 EQU 00010101B ; WRITE REGISTER SELECT #5 CCSRSTAT EQU 00010000B ; RESET EXT/STATUS INTERRUPTS ; USE TO READ BACK STATUS OF ; DCD & CTS PINS. ; (DART) INITIALIZATION CONSTANT FOR WR1, INTERRUPT CONTROL. CCSINTIN EQU 00011000B ; COPIED JRS'S CODE ; BIT 0 = EXT INT ENABLE ; BIT 1 = TX INT ENABLE ; BIT 2 = STATUS AFFECTS VECTOR ; BIT 3 & 4 ; 00 = RX INT DISABLE ; 01 = RX INT ON 1ST CHAR ; 10 = INT ON ALL RX CHAR, PARITY SETS VECTOR ; 11 = INT ON ALL RX CHAR, PARITY NA ON VECTOR ; BIT 5 = WAIT/READY ON R/T ; BIT 6 = WAIT/READY FUNCTION ; BIT 7 = WAIT/READY ENABLE  ; (DART) INITIALIZATION CONSTANT FOR WR2, INTERRUPT VECTOR (CH B ONLY). ; (DART) INITIALIZATION CONSTANT FOR WR3, RECIEVER DATA. CCSRXINI EQU 11000001B ; 8 DATA BITS, INTERRUPTS ; BIT 0 = RX ENABLE ; BIT 1,2,3,4 = UNUSED ; BIT 5 = AUTO ENABLE ; BIT 6 & 7 ; 00 = RX 5 BITS/CHAR ; 01 = RX 7 BITS/CHAR ; 10 = RX 6 BITS/CHAR ; 11 = RX 8 BITS/CHAR ; (DART) INITIALIZATION CONSTANT FOR WR4, CLOCKING & PARITY. CCSCKINI EQU 10000100B ; 32X CLOCK, 1 STOP BIT, NO PARITY ; BIT 0 = PARITY ENABLE ; BIT 1 = PARITY EVEN/*ODD ; BIT 2 & 3 ; 00 = UNUSED ; 01 = 1 STOP BIT ; 10 = 1 1/2 STOP BITS ; 11 = 2 STOP BITS ; BIT 4 = UNUSED ; BIT 5 & 6 ; 00 = 1X CLOCK RATE ; 01 = 16X CLOCK RATE ; 10 = 32X CLOCK RATE ; 11 = 64X CLOCK RATE ; (DART) INITIALIZATION CONSTANT FOR WR5, TRANSMITTER DATA. CCSTXINI EQU 11101010B ; DTR, TX 8 BITS, TX ENABLE, RTS ; BIT 0 = UNUSED ; BIT 1 = RTS  ; BIT 2 = UNUSED ; BIT 3 = TX ENABLE ; BIT 4 & 5 ; 00 = TX 5 BITS ; 01 = TX 7 BITS ; 10 = TX 6 BITS ; 11 = TX 8 BITS ; BIT 7 = DTR ; DEFAULT CONSOLE INITIALIZATION TABLE ORG 100H ; TO MAKE LOAD HAPPY CLTBL EQU $ ; CONSOLE/LIST DEVICES -- INITIALIZATION ; STREAM TABLE. DB SIZE2,CTC0 ; CTC CHANNEL 0 (DART A BAUD RATE) J SET $ DB CCCINI0 ; CTC CHANNEL 0 INTIALIZATION WORD DB CCCTC96 ; CONSOLE BAUD RATE OF 9600. SIZE2 EQU $-J DB SIZE1,CRTCTL ; SIO # 1 CHANNEL A J SET $ DB CCSRESET ; RESET CHANNEL. DB CCSWRSL4 ; SELECT WRITE REGISTER 4. DB CCSCKINI ; 32X CLOCK, 1 STOP BIT, NO PARITY. DB CCSWRSL3 ; SELECT WRITE REGISTER 3 DB CCSRXINI ; RX 8 BITS, NO HANDSHAKING, RX ENABLE. DB CCSWRSL5 ; SELECT WRITE REGISTER 5 DB CCSTXINI ; DTR, TX 8 BITS, TX ENABLE, *RTS LOW. DB CCSWRSL1 ; SELECT WRITE REGISTER 1. DB 0 ; NO INTERRUPTS SIZE1 EQU $-J DB 0 ; TERMINATE TABLE END 1 TITLE 'MOVE MEMORY-MEMORY FOR BULLET SBC & CP/M 3.0' ;********************************************************************** ; ; THIS IS AN UNPUBLISHED WORK WHICH IS THE PROPERTY OF WAVE MATE, INC. ; THIS WORK CONTAINS PROPRIETARY INFORMATION AND IS PROVIDED UNDER A ; CONFIDENTIAL RELATIONSHIP FOR A SPECIFIC PURPOSE. THE RECIPENT, BY ; ACCEPTANCE, ASSUMES CUSTODY THEREOF AND AGREES NOT TO DISCLOSE OR ; TRANSFER THIS WORK IN WHOLE OR IN PART WITHOUT WRITTEN PERMISSION OF ; WAVE MATE, INC.; 14009 S. CRENSHAW BLVD.; HAWTHORNE, CA 90250; USA ; ;********************************************************************** ;******************************************************** ;* * ;* MOVE MODULE FOR CP/M 3.0 MODULAR BIOS * ;* * ;* THIS MODULE PROVIDES MEMORY TO MEMORY * ;* BLOCK MOVES AND CONTROLS BANK SELECTION * ;* FOR WAVE MATE'S BULLET SBC * ;* * ;******************************************************** ; last edit 6-19-83, 20:12, by dwp. FALSE EQU 0 TRUE EQU NOT FALSE M80 EQU true ; SELECT PROPER ASSEMBLER IF M80 .Z80 .SFCOND ; SUPRESS FALSE CONDITIONALS ELSE LIST NOCOND ENDIF IF M80 CSEG ELSE REL ENDIF ENTRY ?MOVE,?XMOVE,?BANK EXTRN INISTM IF M80 PAGE ELSE FORM ENDIF ; MOVE -- MEMORY TO MEMORY BLOCK MOVE. ; ; ENTERS: HL = DESTINATION ADDRESS. ; DE = SOURCE ADDRESS. ; BC = COUNT. ; ; RETURNS: HL & DE = POINT TO NEXT BYTES FOLLOWING MOVE OP ; ; NOTE: THIS ROUTINE HAS BEEN CALLED BY BDOS WITH BC = 0. ; A BUG. THEREFORE WE CHECK FOR THIS POSSIBILITY. ; ?MOVE: LD A,B ; CK FOR ZERO LENGTH MOVE OR C RET Z ; RETURN TO THE TURKEY LD A,(XFLAG) ; EXTENDED MEMORY MOVE? AND A ; IF FLAG <> 0 JR NZ,MOVEX ; THEN XMOVE WAS CALLED EX DE,HL ; NO, JUST USE Z80 LDIR INST LDIR EX DE,HL RET ; MOVE DONE ; ; EXTENDED MEMORY MOVE REQUIRED ; MOVEX: XOR A ; CLR XFLAG LD (XFLAG),A LD (SRC),DE ; SET SOURCE ADDRESS LD (DEST),HL ; AND DESTINATION ADDRESS ADD HL,BC ; SET RETURN VALUES PUSH HL EX DE,HL ADD HL,BC PUSH HL DEC BC ; ADJUST BYTE COUNT FOR DMA LD (CNT),BC ; AND SET DMA BYTE COUNT LD A,B ; CK FOR ONE BYTE MOVE OR C ; FLAGS SET LD A,0CDH ; ASSUME MORE THAN ONE BYTE JR NZ,MVX1 ; B/ MORE THAN ONE BYTE LD A,08DH ; SELECT BYTE MODE MVX1: LD (DMODE),A ; SET BYTE/BURST MODE LD HL,(INTER) ; GET SOURCE/DEST BANKS LD A,H ; ck for inter bank xfer RLA ; make an index OR L AND 3 LD L,A LD H,0 LD DE,dmmtbl ADD HL,DE LD A,(HL) ; a = mux value LD HL,MVBLK ; POINT TO DMA PGM BLOCK DI ; DON'T ALLOW FDC TO INTERRUPT OUT (17H),A ; PROGRAM DMA MUX CALL INISTM ; ISSUE DMA COMMANDS LD A,(DMODE) ; CK IF THIS WAS SINGLE BYTE MOVE CP 08DH ; SINGLE BYTE CODE? JR Z,MVX6 ; B/ YES, IGNORE END OF BLOCK TEST MVX2: IN A,(14H) ; GET DMA STATUS AND 20H ; CK FOR END OF BLOCK JR NZ,MVX2 ; B/ NOT DONE! MVX6: LD A,83H ; DISABLE DMA OUT (14H),A EI POP DE ; RESTORE POINTERS POP HL LD BC,0 RET ; XMOVE DONE ; DMA MUX VALUES FOR PHYSICAL BANK MOVES: dmmtbl: defb 00001000b ; move from bank 1 to bank 1 defb 00010000b ; move from bank 0 to bank 1 defb 00011000b ; move from bank 1 to bank 0 defb 00000000b ; move from bank 0 to bank 0 MVBLK: DEFB 11H,14H ; BLOCK COUNT & PORT ADDRESS DEFB 83H,7DH ; DISABLE DMA, ADR & BLK LEN FOLLOW SRC: DEFS 2 CNT: DEFS 2 DEFB 14H,10H ; A INCREMENTS, B INCREMENTS DMODE: DEFS 1 ; DMA MODE, BYTE/BURST DEST: DEFS 2 DEFB 82H,0CFH ; LOAD A, CLR BYTE COUNT DEFB 8BH ; REINIT STATUS BYTE DEFB 0B3H ; FORCE READY DEFB 87H,0BFH ; ENABLE DMA, READ STATUS DEFB 0 ; END TABLES XFLAG: DEFB 0 ; INIT VALUE FOR XFLAG INTER: DEFS 2 IF M80 PAGE ELSE FORM ENDIF ; XMOVE -- SET BANKS FOR FOLLOWING MOVE: ; ; ENTERS: B=DESTINATION BANK ; C=SOURCE BANK ; ; RETURNS: NOTHING ; ; XMOVE PROVIDES FOR BANKED SYSTEMS WHICH SUPPORT MEMORY TO ; MEMORY DMA TRANSFERS OVER THE EXTENDED ADDRESS SYSTEM. ; ; IF NOT IMPLEMENTED THE FIRST INSTRUCTION MUST BE A RET! ; ; ?XMOVE: LD A,-1 ; SET XMOVE FLAG LD (XFLAG),A LD (INTER),BC ; SAVE INTER BANK DATA RET IF M80 PAGE ELSE FORM ENDIF ; SELMEM -- SELECT THE CURRENT MEMORY BANK FOR FURTHER EXECUTION. ; ; ENTERS: A = MEMORY BANK ; ALL OTHER REGISTERS MUST BE PRESERVED ; ?BANK: CPL ; CONVERT LOGICAL TO PHYSICAL BANK AND 1 ; DISCARD ALL BUT LS BIT OUT (1AH),A ; SET STATE OF HARDWARE RET END 1 TITLE 'BOOT MODULE FOR BULLET CBIOS FOR CP/M 3.0' ;********************************************************************** ; ; THIS IS AN UNPUBLISHED WORK WHICH IS THE PROPERTY OF WAVE MATE, INC. ; THIS WORK CONTAINS PROPRIETARY INFORMATION AND IS PROVIDED UNDER A ; CONFIDENTIAL RELATIONSHIP FOR A SPECIFIC PURPOSE. THE RECIPENT, BY ; ACCEPTANCE, ASSUMES CUSTODY THEREOF AND AGREES NOT TO DISCLOSE OR ; TRANSFER THIS WORK IN WHOLE OR IN PART WITHOUT WRITTEN PERMISSION OF ; WAVE MATE, INC.; 14009 S. CRENSHAW BLVD.; HAWTHORNE, CA 90250; USA ; ;********************************************************************** ;*************************************************************** ;* ;* THIS MODULE LOADS THE CCP INTO A INTERNAL BUFFER IN THE SYSTEM ;* BANK AND RELOADS THE CCP INTO THE USER BANK ON WARM OR COLD ;* BOOT. IT ALSO PRINTS THE SIGNON MESSAGE ON COLD BOOT. ;* IT INITIALIZES THE CONSOLE, AUX, AND LIST I/O VECTORS. ;* ;*************************************************************** ; EDIT 8-1-83, 12:10, DWP. VERS EQU 6 REV EQU 'g' FALSE EQU 0 TRUE EQU NOT FALSE CR EQU 13 LF EQU 10 BDOS EQU 5 ; JUMP VECTOR TO CP/M SET BY BIOSKRNL CCPSIZ EQU 25+1 ; NUMBER OF 128 BYTE RECORDS IN CCP.COM ; PLUS ONE TO FORCE EOF ERROR FROM BDOS TPBASE EQU 100H ; LOAD POINT FOR CCP M80 EQU true ; SELECT PROPER ASSEMBLER IF M80 .Z80 .SFCOND ; SUPPRESS FALSE CONDITIONALS ELSE LIST NOCOND ENDIF ; ; ; Entry points for BIOS functions supported in this module. ; ENTRY ?INIT,?LDCCP,?RLCCP,?TIME ; ; ; External BIOS functions used by this module. ; EXTRN ?BNKSL,?MOV,?XMOV,?PMSG ; ; ; External data objects referenced in this module. ; EXTRN @COVEC,@CIVEC,@LOVEC,@AOVEC,@AIVEC,INTVTR ; IF M80 PAGE ELSE FORM ENDIF IF M80 DSEG ELSE DATA ENDIF ; INIT -- THIS ROUTINE SETS UP THE INTERRUPT VECTORS ENABLES INTERRUPTS ; IT ALSO DEFINES THE LOGICAL CHARACTER I/O DEVICES. ; ?INIT: DI ; SHOULD BE OFF, MAKE SURE. IM 2 ; SET INTERRUPT MODE 2. LD HL,INTVTR LD A,H ; LOAD INTERRUPT VECTOR PAGE LD I,A ; INTO THE Z80 I REGISTER. LD HL,8000H ; SET UP CONSOLE LD (@CIVEC),HL LD (@COVEC),HL LD HL,2000H ; SET UP LIST LD (@LOVEC),HL LD HL,4000H ; SET UP AUX DEV LD (@AIVEC),HL LD (@AOVEC),HL EI ; LET INTERRUPTS THROUGH. LD HL,SIGNON ; POINT TO SIGN ON MESSAGE CALL ?PMSG RET IF M80 PAGE ELSE FORM ENDIF IF M80 CSEG ELSE REL ENDIF ; ; ?LDCCP -- THIS SUBROUTINE IS CALLED FROM BIOSKRNL TO LOAD THE ; CCP FROM CCP.COM. IT IS LOADED INTO A INTERNAL BUFFER AREA IN ; PHYSICAL BANK 1 (LOGICAL BANK 0). WHEN ?RLCCP IS CALLED IT IS MOVED ; FROM THE INTERNAL BUFFER INTO PHYSICAL BANK 0 FOR EXECUTION. ; NOTE: WHEN ?LDCCP IS CALLED, LOGICAL BANK 1 IS IN CONTEXT. ; ?LDCCP: ; ; OPEN 'A:CCP.COM' ; XOR A LD (CCP$FCB+15),A LD HL,0 LD (FCB$NR),HL LD DE,CCP$FCB ; OPEN FILE 'CCP.COM' LD C,15 CALL BDOS INC A ; FILE OPEN? JR NZ,CCPOPEN ; B/ YES LD HL,NOCCP$ ; DISPLAY MESSAGE "NO CCP.COM", ETC. CALL PUTMSG ; SWAP BANK & DISPLAY LD C,1 ; GET CONSOLE INPUT CALL BDOS LD HL,CRLF CALL ?PMSG JR ?LDCCP ; ; LOAD IN CCP FROM 'CCP.COM' ; CCPOPEN: LD DE,CCPSIZ ; SET MULTI SECTOR COUNT = CCPSIZ LD C,44 CALL BDOS LD DE,TPBASE LD C,26 CALL BDOS ; SET DMA ADDRESS LD DE,CCP$FCB LD C,20 CALL BDOS ; READ RECORDS. (IF ERROR, BDOS REPORTS) CP 1 ; EOF HIT? JR Z,CPYCCP ; YES, COPY IT INTO BUFFER LD HL,BGCCP$ ; DISPLAY CCP TOO BIG CALL PUTMSG JR $ ; ; NOW THE CCP IS SITTING IN LOGICAL BANK ONE STARTING AT 0100H. (TPBASE) ; CPYCCP: LD B,0 ; DESTINATION IS LOGICAL BANK 0 LD C,1 ; SOURCE IS LOGICAL BANK 1 CALL ?XMOV ; SET UP FOR BANK-BANK MOVE LD DE,TPBASE ; SET SOURCE ADDRESS LD HL,CCPBUF ; DESTINATION ADDRESSSS JR RLCCP1 ; HIT RLCCP TO FINISH MOVE IF M80 PAGE ELSE FORM ENDIF ; RLCCP -- THIS ROUTINE IS CALLED TO RELOAD THE CCP. SINCE WE SAVE A COPY ; IN THE ALT MEMORY BANK IT MERELY TRANSFERS IT FROM ONE BANK TO ANOTHER. ; ?RLCCP2: LD B,1 ; DESTINATION IS LOGICAL BANK 1 LD C,0 ; SOURCE IS LOGICAL BANK 0 CALL ?XMOV ; SET UP FOR BANK-BANK MOVE LD DE,CCPBUF ; SET SOURCE ADDRESS LD HL,TPBASE ; DESTINATION ADDRESS RLCCP1: LD BC,CCPSIZ*128 ; BYTE COUNT CALL ?MOV ; MOVE IT LD A,1 ; SELECT LOGICAL BANK 1 JP ?BNKSL ; ; ; CBIOS FUNCTION NO. 26. GET/SET SYSTEM TIME. ; ; ENTRY: IF C = 0 THEN THE TIME FIELDS IN THE SCB SHOULD BE ; SET TO THE CBIOS INTERNAL TIME. ; IF C = FF THEN THE INTERNAL TIME SHOULD BE SET EQUAL ; TO THE SCB TIME FIELDS. ; ; ?TIME: RET ; LET CLOCK MODULE TAKE CARE OF ; MAINTAINING THE TIME IN THE SCB ; ; PUTMSG -- ENTER WITH HL POINTING TO ASCII TEXT, NULL TERMINATED ; PUTMSG: LD A,0 ; SELECT LOGICAL BANK ZERO CALL ?BNKSL ; WHERE THE NO CCP MSG RESIDES CALL ?PMSG LD A,1 ; SELECT BANK 1 (USER) CALL ?BNKSL RET IF M80 PAGE ELSE FORM ENDIF CCP$FCB: DEFB 1 ; DRIVE A DEFB 'CCP COM' DEFB 0 ; EX DEFB 0 ; S1 DEFB 0 ; S2 DEFB 0 ; RC  DEFW 0,0 ; D0 -- DEFW 0,0 DEFW 0,0 DEFW 0,0 ; --DN FCB$NR: DB 0 DB 0,0,0 CRLF: DEFB CR,LF,0 IF M80 DSEG ELSE DATA ENDIF ; TEXT MESSAGES ARE IN LOGICAL BANK ZERO (SYSTEM MEMORY) BGCCP$: DB 'CCP.COM too big for buffer in boot module',0 NOCCP$: DB 'CCP.COM Not found. Press RETURN to retry: ',0 SIGNON: DEFB CR,LF defb 'CP/M Version 3.0 with BULLET SBC Banked CBIOS V' DEFB '0',VERS+'0', REV DEFB CR,LF,0 ; SAVE BUFFER FOR CCP IS IN LOGICAL BANK ZERO (SYSTEM MEMORY) CCPBUF: DEFS CCPSIZ*128 END LINK BNKBIOS3[B]=BIOSKRNL,BOOT,CHARIO,DRVTBL,SCB,FDDRV,HDDRV,MOVE,CLOCK[NR] ;* THE FOLLOWING INFORMATION IS RELAVANT TO THE STANDARDS FOR ;* I/O DEVICE INITIALIZATION CONSTANTS: INSOFAR AS POSSIBLE ;* ALL CONSTANTS SHOULD BE EQUATED HERE AT THE BEGINING OF THE ;* CODE. INITIALIZATION CONSTANTS BEGIN WITH THE FIRST TWO ;* CHARACTERS BEING "CC" WHICH STAND FOR CHANNEL CONTROL. ;* THE NEXT CHARACTER REFERS TO WHICH CHANNEL THE CONTROL WORD ;* APPLIES. THE FOLLOWING ARE THE STANDARD CODES: ;* ;* S = SERIAL DEVICE (DART) ;* F = FLOPPY DISK CONTROLLER ;* C = COUNTER/TIMER DEVICE ;* D = DMA DEVICE ;* P = PARALLEL I/O DEVICE ;* ;* THE ADDITIONAL CHARACTERS IN THE CONSTANT EQUATE ARE PROGRAMMER ;* DEFINED TO GIVE SOME ADDTIONAL INDICATION OF THE FUNCTION OF THE ;* CONSTANT. I.E. CCDRSET COULD MEAN CHANNEL CONTROL WORD TO ;* RESET THE DMA DEVICE. ; 1793 FLOPPY DISK CONTROLLER PORT DEFINITIONS: FDCCMD EQU 10H ; COMMAND PORT (OUT) FDCSTA EQU FDCCMD ; STATUS PORT (IN) FDTRK EQU FDCCMD+1 ; TRACK REGISTER (IN/OUT) FDSEC EQU FDCCMD+2 ; SECTOR REGISTER (IN/OUT) FDDAT2A EQU FDSEC+1 ; DATA REGISTER (IN/OUT) ; FLOPPY DISK CONTROLLER RETRY ASSIGNMENTS: MAXRW EQU 12 ; MAXIMUM # R/W RETRIES. MAXVER EQU 12 ; MAXIMUM # VERIFY RETRIES. SKTRYS EQU 5 ; MAXIMUM # SEEK RETRIES. ; 1793 COMMAND/STATUS DEFINITIONS: CCFRSTOR EQU 03H ; RESTORE COMMAND. CCFSEEK EQU 1CH ; SEEK COMMAND. CCFREAD EQU 80H ; READ SECTOR COMMAND. CCFWRITE EQU 0A0H ; WRITE SECTOR COMMAND. CCFRDAD EQU 0C0H ; READ ADDRESS COMMAND. CCFVRFY EQU 0FFH ; VERIFY SECTOR (SOFTWARE CODE -- NOT ; RECOGNIZED BY 1793). EBIT EQU 2 ; 1793 E FLAG BIT POSITION. CMPSID EQU 2 ; 1793 SIDE COMPARE ENABLE BIT. NOTRDY EQU 80H ; 1793 NOT READY STATUS BIT. BUSY EQU 1 ; 1793 BUSY STATUS BIT. RDAMSK EQU 9DH ; READ ADDRESS STATUS ERROR MASK. RDMSK EQU 9DH ; READ SECTOR STATUS ERROR MASK. VERMSK EQU RDMSK ; VERIFY SECTOR STATUS ERROR MASK. WRTMSK EQU 0FDH ; WRITE SECTOR STATUS ERROR MASK. SKMSK EQU 99H ; SEEK STATUS ERROR MASK. NBPA EQU 6 ; NUMBER BYTES IN ADDRESS HEADER. ; STEPPING RATE SELECTION. MINI/MAXI STEP RATE IN MILLISECONDS. RATE0 EQU 00000011B ; BITS TO SET STEP RATE 0 (30/15MS) RATE1 EQU 00000010B ; BITS TO SET STEP RATE 1 (20/10MS) RATE2 EQU 00000001B ; BITS TO SET STEP RATE 2 (12/6MS) RATE3 EQU 00000000B ; BITS TO SET STEP RATE 3 (6/3MS) ; FLOPPY DISK EXTERNAL CONTROLLER PORT LOCATION: FDXCTL EQU 16H ; PORT ADDRESS. ; FLOPPY DISK EXTERNAL CONTROL PORT BIT DEFINITIONS FDUNIT0 EQU 00000000B ; BITS FOR UNIT 0 SELECT FDUNIT1 EQU 00000001B ; BITS FOR UNIT 1 SELECT FDUNIT2 EQU 00000010B ; BITS FOR UNIT 2 SELECT FDUNIT3 EQU 00000011B ; BITS FOR UNIT 3 SELECT FDUNITX EQU 00000110B ; BITS TO SELECT NO UNIT. (LED'S OUT) MXSLCT EQU 00000100B ; BIT FOR MAXI FLOPPY SELECT MNSLCT EQU 00000000B ; BIT FOR MINI FLOPPY SELECT SWSLCT EQU 00001000B ; SELECT SOFTWARE CONTROL OF PORT FDSIDE0 EQU 00000000B ; BIT TO SELECT SIDE 0 FDSIDE1 EQU 00010000B ; BIT TO SELECT SIDE 1 FDMOTOR EQU 00100000B ; BIT TO TURN MINI FLOPPY MOTOR OFF ; FLOPPY DISK HARDWARE CONTROL PORT: FDHWCNL EQU 18H ; PORT FOR FLOPPY HARDWARE CONTROL ; FLOPPY DISK HARDWARE CONTROL BITS: FDPLO EQU 00000001B ; BIT CONTROLS PHASE LOCK LOOP OSC FDRCD EQU 00000010B ; BIT CONTROLS READ CLOCK DIVIDE FDEXC EQU 00000100B ; BIT CONTROLS 1793 CLOCK FDDEN EQU 00001000B ; BIT CONTROLS 1793 DDEN PIN FDSW EQU 00010000B ; BIT CONTROLS SOFTWARE SELECT OR ; HARDWARE SELECT OF ABOVE FUNCTIONS ; NOTE: BITS 7,6,5 IN FDHWCNL ARE UNUSED ; EQUATES FOR EACH OF THE FOUR DIFFERENT TYPES OF DISKETTES THAT THE ; HARDWARE CAN READ: ; MAXI DOUBLE DENSITY: MXDD EQU FDSW ; MAXI SINGLE DENSITY: MXSD EQU FDSW+FDDEN+FDPLO ; MINI DOUBLE DENSITY MNDD EQU FDSW+FDEXC+FDPLO ; MINI SINGLE DENSITY: MNSD EQU FDSW+FDDEN+FDEXC+FDRCD+FDPLO ; HARDWARE STATUS SELECTION PORT DEFINITIONS: HRDSTA EQU 19H ; PORT ADDRESS. ; HARDWARE PORT BIT DEFINITIONS: HDLOAD EQU 00010000B ; BIT - FLOPPY DISK HEAD IS LOADED. XDCG EQU 00100000B ; DISK CHANGED STATUS BIT FDIRQ EQU 01000000B ; BIT - 1793 IRQ REQUEST FDDRQ EQU 10000000B ; BIT - 1793 DRQ REQUEST ; ZILOG DMA CONTROLLER PORT: DMA EQU 14H ; ZILOG DMA CHANNEL CONTROL WORDS: CCDRSET EQU 0C3H ; SOFTWARE RESET CCDENAB EQU 087H ; ENABLE DMA CCDDISA EQU 083H ; DISABLE DMA ; EXTERNAL DMA MULTIPLEXER PORT: DMAMUX EQU 17H ; DMA MUX BIT SELECTIONS: ; DMA MUX CHANNEL SELECT. BITS 2,1,0. DMAFDC EQU 0 ; SELECT FLOPPY DISK FOR DMA OPERATION DMASIOA EQU 1 ; SELECT DART CHANNEL A FOR DMA OPERATION DMASIOB EQU 2 ; SELECT DART CHANNEL B FOR DMA OPERATION DMAWIN EQU 3 ; SELECT WINCHESTER DISK FOR DMA OPERATION DMAEXT1 EQU 4 ; SELECT EXTERNAL DEVICE 1 FOR DMA OPERATION DMAEXT2 EQU 5 ; SELECT EXTERNAL DEVICE 2 FOR DMA OPERATION ; DMA MAIN MEMORY - BUFFER MEMORY SELECTION: ; DMA MEMORY XFER SELECT, BITS 4,3. DMAMM EQU 00000000B ; DMA MAIN MEMORY TO MAIN MEMORY DMABB EQU 00001000B ; DMA BUFFER MEMORY TO BUFFER MEMORY DMAMB EQU 00010000B ; DMA MAIN MEMORY TO BUFFER MEMORY DMABM EQU 00011000B ; DMA BUFFER MEMORY TO MAIN MEMORY ; PIO PORT DEFINITIONS: PIOADAT EQU 4 ; PIO PORT A DATA PIOBDAT EQU 5 ; PIO PORT B DATA PIOACNL EQU 6 ; PIO PORT A CONTROL (WRITE ONLY) PIOBCNL EQU 7 ; PIO PORT B CONTROL (WRITE ONLY) ; PIO CHANNEL CONTROL DEFINITIONS CCPMOD0 EQU 00001111B ; INITIALIZE PARALLEL PORT TO MODE 0 CCPMOD1 EQU 01001111B ; INITIALIZE PARALLEL PORT TO MODE 1 CCPMOD2 EQU 10001111B ; INITIALIZE PARALLEL PORT TO MODE 2 CCPMOD3 EQU 11001111B ; INITIALIZE PARALLEL PORT TO MODE 3 ; NOTE: IN MODE 3, NEXT CONTROL WORD ; MUST DEFINE WHICH BITS ARE INPUTS ; AND WHICH BITS ARE OUTPUTS. CCPBITS EQU 11111111B ; SELECT ALL BITS FOR INPUTS. ; BIT DEFINITIONS OF WAVE MATE SBC PIO PORT B INPUTS. ; BIT 0: CENTRONICS BUSY ; BIT 1: CENTRONICS PAPER END ; BIT 2: CENTRONICS SELECTED ; BIT 3: CENTRONICS *FAULT (SOME ERROR WITH HARDWARE) ; BIT 4: EXTVCTR (EXTERNAL BUS VECTOR REQUEST) ; BIT 5: WINCHESTER BUS DIRECTION ; BIT 6: WINCHESTER COMMAND COMPLET3E ; BIT 7: WINCHESTER READY ; NOTE: THE PIO INTERRUPT VECTOR IS SET BY WRITING IT TO THE ; DESIRED PORT. BIT 0 MUST BE RESET ON THE VECTOR. THIS BIT ; BEING ZERO IS WHAT SIGNALS THE PIO THAT AN INTERRUPT VECTOR IS BEING SET. ; PIO INTERRUPT CONTROL WORD: CCPICW EQU 00110111B ; INTERRUPT CONTROL WORD. DEFINITIONS: ; BITS 0-3, INTERRUPT CONTROL WORD I.D. ; BIT 4: SET= MASK FOLLOWS ; BIT 5: SET= ACTIVE LEVEL IS HIGH ; BIT 6: SET= INTERRUPT ON AND FUNCTION ; RESET= INTERRUPT ON OR FUNCTION ; BIT 7: SET= INTERRUPTS ENABLED. CCPBMSK EQU 00000001B ; PORT B MASK WORD. (ONLY INTERRUPT ; ON CBUSY). ; ZILOG COUNTER TIMER (CTC) HARDWARE PORT LOCATIONS: CTC0 EQU 8 ; CTC CHANNEL 0 CTC1 EQU CTC0+1 ; CTC CHANNEL 1 CTC2 EQU CTC1+1 ; CTC CHANNEL 2 CTC3 EQU CTC2+1 ; CTC CHANNEL 3 ; COUNTER TIMER CHANNEL INITIALIZATION CONTROL WORDS: CCCRSET EQU 00000010B ; SOFTWARE CHANNEL RESET ; BIT 1 = RESET CCCINI0 EQU 01000101B ; INIT WORD FOR CHANNEL 0 ; BIT 0 = CONTROL WORD ; BIT 2 = TIME CONSTANT FOLLOWS ; BIT 3 = AUTO TRIGGER ; BIT 5 = PRESCALE 16 (NA FOR COUNTER) ; BIT 6 = COUNTER MODE ; BIT 7 = DISABLE INTERRUPTS CCCINI1 EQU CCCINI0 ; INIT WORD FOR CHANNEL 1 CCCINI2 EQU CCCINI0 ; INIT WORD FOR CHANNEL 2 CCCINI3 EQU 11000101B ; INIT WORD FOR CHANNEL 3 ; BIT 0 = CONTROL WORD ; BIT 2 TIME CONSTANT FOLLOWS ; BIT 3 = AUTO TRIGGER ; BIT 5 = PRESCALER 16 (NA FOR COUNTER) ; BIT 6 = COUNTER MODE ; BIT 7 = ENABLE INTERRUPTS ; COUNTER TIMER CHANNEL TIME CONSTANTS FOR BAUD RATES: CCCTC384 EQU 00000001B ; TIME CONSTANT = 38.4K BAUD*32 CCCTC192 EQU 00000010B ; TIME CONSTANT = 19.2K BAUD*32 CCCTC96 EQU 00000100B ; TIME CONSTANT = 9600 BAUD*32 CCCTC48 EQU 00001000B ; TIME CONSTANT = 4800 BAUD*32 CCCTC24 EQU 00010000B ; TIME CONSTANT = 2400 BAUD*32 CCCTC12 EQU 00100000B ; TIME CONSTANT = 1200 BAUD*32 CCCTC6 EQU 01000000B ; TIME CONSTANT = 600 BAUD*32 CCCTC3 EQU 10000000B ; TIME CONSTANT = 300 BAUD*32 CCCTC1$5 EQU 10000000B ; TIME CONSTANT = 150 BAUD*64 CCCTC1$1 EQU 174 ; TIME CONSTANT = 110 BAUD*64 ; CRT DEFINITIONS: CRTDAT EQU 00H ; DATA PORT CRTSTS EQU CRTDAT+1 ; STATUS PORT CRTCTL EQU CRTSTS ; CONTROL PORT CRTDAV EQU 01H ; RECEIVER DATA AVAILABLE MASK CRTTBE EQU 04H ; TRANSMIT BUFFER EMPTY MASK ; LINE PRINTER DEFINITIONS: LPTDAT EQU 02H ; DATA PORT LPTSTS EQU LPTDAT+1 ; STATUS PORT LPTCTL EQU LPTSTS ; CONTROL PORT LPTDAV EQU 01H ; RECEIVER DATA AVAILABLE MASK LPTTBE EQU 04H ; TRANSMIT BUFFER EMPTY MASK ; (DART) INITIALIZATION CONSTANT FOR WR0, RESET & REGISTER SELECT. CCSRESET EQU 00011000B ; SOFTWARE CHANNEL RESET ; BIT 1 = SOFTWARE RESET CCSWRSL0 EQU 00010000B ; WRITE REGISTER SELECT #0 CCSWRSL1 EQU 00000001B ; WRITE REGISTER SELECT #1 ; ? I COPIED FROM JRS'S CODE FOR ABOVE CCSWRSL2 EQU 00010010B ; WRITE REGISTER SELECT #2 CCSWRSL3 EQU 00010011B ; WRITE REGISTER SELECT #3 CCSWRSL4 EQU 00010100B ; WRITE REGISTER SELECT #4 CCSWRSL5 EQU 00010101B ; WRITE REGISTER SELECT #5 CCSRSTAT EQU 00010000B ; RESET EXT/STATUS INTERRUPTS ; USE TO READ BACK STATUS OF ; DCD & CTS PINS. ; (DART) INITIALIZATION CONSTANT FOR WR1, INTERRUPT CONTROL. CCSINTIN EQU 00011000B ; COPIED JRS'S CODE ; BIT 0 = EXT INT ENABLE ; BIT 1 = TX INT ENABLE ; BIT 2 = STATUS AFFECTS VECTOR ; BIT 3 & 4 ; 00 = RX INT DISABLE ; 01 = RX INT ON 1ST CHAR ; 10 = INT ON ALL RX CHAR, PARITY SETS VECTOR ; 11 = INT ON ALL RX CHAR, PARITY NA ON VECTOR ; BIT 5 = WAIT/READY ON R/T ; BIT 6 = WAIT/READY FUNCTION ; BIT 7 = WAIT/READY ENABLE ; (DART) INITIALIZATION CONSTANT FOR WR2, INTERRUPT VECTOR (CH B ONLY). ; (DART) INITIALIZATION CONSTANT FOR WR3, RECIEVER DATA. CCSRXINI EQU 11000001B ; 8 DATA BITS, INTERRUPTS ; BIT 0 = RX ENABLE ; BIT 1,2,3,4 = UNUSED ; BIT 5 = AUTO ENABLE ; BIT 6 & 7 ; 00 = RX 5 BITS/CHAR ; 01 = RX 7 BITS/CHAR ; 10 = RX 6 BITS/CHAR ; 11 = RX 8 BITS/CHAR ; (DART) INITIALIZATION CONSTANT FOR WR4, CLOCKING & PARITY. CCSCKINI EQU 10000100B ; 32X CLOCK, 1 STOP BIT, NO PARITY ; BIT 0 = PARITY ENABLE ; BIT 1 = PARITY EVEN/*ODD ; BIT 2 & 3 ; 00 = UNUSED ; 01 = 1 STOP BIT ; 10 = 1 1/2 STOP BITS ; 11 = 2 STOP BITS ; BIT 4 = UNUSED ; BIT 5 & 6 ; 00 = 1X CLOCK RATE ; 01 = 16X CLOCK RATE ; 10 = 32X CLOCK RATE ; 11 = 64X CLOCK RATE ; (DART) INITIALIZATION CONSTANT FOR WR5, TRANSMITTER DATA. CCSTXINI EQU 11101010B ; DTR, TX 8 BITS, TX ENABLE, RTS ; BIT 0 = UNUSED ; BIT 1 = RTS ; BIT 2 = UNUSED ; BIT 3 = TX ENABLE ; BIT 4 & 5 ; 00 = TX 5 BITS ; 01 = TX 7 BITS ; 10 = TX 6 BITS ; 11 = TX 8 BITS ; BIT 7 = DTR ; MEMORY BANK CONTROL PORT: BANKSET EQU 1AH ; PORT LOCATION FOR BANK SELECT 3 title 'Disk Drive Table Module for CP/M V3.0' ; EDIT DATE 8-1-83, 11:23 BY DWP. (for strange side formats) fdvers dw 5 ; floppy disk drive table version identifier ; this value is tested by FDDRV module ; to ensure that disk defs are compatable public fdvers false equ 0 true equ not false ; Customized for Wave Mate Bullet Single Board Computer. bootdrive equ 5 ; set boot drive as 5" harddisk equ true ; conditionally assemble hard disk hardsize equ 20 ; set harddisk size = 20MB maclib dskdef ; invoke disk definition mocros: ; Equates for all XDPH's and DPB's: ; sd equ 0 ; flag for single density dd equ -1 ; flag for double density s1 equ 0 ; flag for single sided s2 equ -1 ; flag for double sided unit0 equ 0 ; hardware unit numbers unit1 equ 1 unit2 equ 2 unit3 equ 3 fdsel equ 4h ; bit to select 8" drive mdsel equ 0 ; bit to select 5" drive wdsel equ 80h ; winchester disk bit rate0 equ 0 ; 3/6 ms step rate rate1 equ 1 ; 6/12 ms step rate  rate2 equ 2 ; 10/20 ms step rate rate3 equ 3 ; 15/30 ms step rate mxrate equ 4 ; 3 ms step rate on minifloppies ; ; default all disk drives to nonexistent then fill in ; Adisk set false Bdisk set false Cdisk set false Ddisk set false Edisk set false Fdisk set false Gdisk set false Hdisk set false Idisk set false Jdisk set false Kdisk set false Ldisk set false Mdisk set false Ndisk set false Odisk set false Pdisk set false page ; Naming conventions for XDPH's: ; ; hd5x20 = 5" hard disk, 20 megabyte ; fdx1(n) = 8" diskette, double density, 1 side, unit (n) ; fsx1(n) = 8" diskette, single density, 1 side, unit (n) ; fdx2(n) = 8" diskette, double density, 2 side, unit (n) ; md4x1(n) = 5" diskette, double density, 40 track, 1 side, unit (n) ; md8x2(n) = 5" diskette, double density, 80 track, 2 side, unit (n) ; Generate the disk drive table so BIOSKRNL can find out if a drive exists cseg ; place drive table in common memory public @dtbl if bootdrive = 8 Adisk set fdx10 Bdisk set fdx11 Cdisk set md8x20 Ddisk set md8x21 Edisk set md4x10 Fdisk set md4x11 else Adisk set md8x20 Bdisk set md8x21 Cdisk set md4x10 Ddisk set md4x11 Edisk set fdx10 Fdisk set fdx11 endif if harddisk if hardsize = 20 Gdisk set hd5x20 endif if hardsize = 15 Gdisk set hd5x15 endif endif ; end of harddisk ; ; now generate the drive table ; @dtbl dw Adisk dw Bdisk dw Cdisk dw Ddisk dw Edisk dw Fdisk dw Gdisk dw Hdisk dw Idisk dw Jdisk dw Kdisk dw Ldisk dw Mdisk dw Ndisk dw Odisk dw Pdisk page ; equates for alternate drive table dssize0 equ 00000000b ; 128 bytes/sector dssize1 equ 00000001b ; 256 bytes/sector dssize2 equ 00000010b ; 512 bytes/sector dssize3 equ 00000011b ; 1024 bytes/sector dfive equ 00000000b ; 5 inch deight equ 00000100b ; 8 inch dsside equ 00000000b ; Single sided ddside equ 00001000b ; Double sided dsdens equ 00000000b ; Single density dddens equ 00010000b ; Double density ; alternate DPB table adpbtb0: ; 8" SS/SD 128 byte sectors (3740 format) 64 directory entries db deight or dsside or dsdens or dssize0 dw trans ; Translate table dw dpbfsx1 ; Point to DPB ; 8" SS/DD 256 byte sectors 128 directory entries db deight or dsside or dddens or dssize1 dw 0 ; No translate table dw dpbfdx1 ; Point to DPB ; 8" DS/DD 256 byte sectors 256 directory entries db deight or ddside or dddens or dssize1 dw 0 ; No translate table dw dpbfdx2 ; Point to DPB ; 8" SS/DD 1024 byte sectors 256 directory entries db deight or dsside or dddens or dssize3 dw 0 ; No translate table dw dpbfdxk ; Point to DPB ; 8" DS/DD 1024 byte sectors 256 directory entries db deight or ddside or dddens or dssize3 dw 0 ; No translate table dw dpbfdxl ; Point to DPB db 0ffh ; End of table page ; extended disk parameter headers (XDPH's) ; dseg ; XDPH's can be in system memory. if harddisk ; externals for hard disk driver extrn hdread,hdwrit,hdlgi4n,hdinit ; generate the XDPH for hard disk dw 0 ; no alternate DPB ; not really necessary dw hdwrit dw hdread dw hdlgin dw hdinit db wdsel+unit0 ; winchester disk unit 0 db 0 if hardsize = 20 hd5x20 dw 0 ; no sector translate table db 0,0,0,0,0,0,0,0,0 ; BDOS scratch area db 0 ; media flag dw dpbhd20 ; disk parameter block dw 0 ; CSV 0 ==> drive is permanent dw 0fffeh ; alloc vector set by gencpm dw 0fffeh,0fffeh ; let gencpm setup dw 0fffeh ; dirbcb, dtabcb, hash db 0 ; hash bank is zero endif ; if hardsize = 15 hd5x15 dw 0 ; no sector translate table db 0,0,0,0,0,0,0,0,0 ; BDOS scratch area db 0 ; media flag dw dpbhd15 ; disk parameter block dw 0 ; CSV 0 ==> drive is permanent dw 0fffeh ; alloc vector set by gencpm dw 0fffeh,0fffeh ; let gencpm setup dw 0fffeh ; dirbcb, dtabcb, hash db 0 ; hash bank is zero endif endif page ; externals for floppies extrn fdread,fdwrit,fdlgin,fdinit ; set up 8 inch floppy drive unit 0. dw adpbtb0 ; alternate DPB available dw fdwrit dw fdread dw fdlgin dw fdinit db fdsel+unit0 ; physical unit 0 db 0 fdx10 dph 0,dpbfdxl ; make it double sided/double density ; MUST be max size for gencpm ; set up 8 inch floppy drive unit 1. dw adpbtb0 ; alternate DPB available dw fdwrit dw fdread dw fdlgin dw fdinit db fdsel+unit1 ; physical unit 1 db 0 fdx11 dph 0,dpbfdxl ; make it double sided/double density ; MUST be max size for gencpm page ; define 5" floppy, double density, 80 track 2 sided drive, unit 0. dw 0 ; no alternate DPB dw fdwrit dw fdread dw fdlgin dw fdinit db mdsel+unit0 ; physical unit 0 db 0 md8x20 dph 0,dpbmd8x2 ; define 5" floppy, double density, 80 track 2 sided drive, unit 1. dw 0 ; no alternate DPB dw fdwrit dw fdread dw fdlgin dw fdinit db mdsel+unit1 ; physical unit 1 db 0 md8x21 dph 0,dpbmd8x2 page ; define 5" floppy, double density, 80 track 2 special sided, unit 2 dw 0 ; no alternate DPB dw fdwrit dw fdread dw fdlgin dw fdinit db mdsel+unit2 ; physical unit 2 db 0 md4x10 dph 0,dpbmd4x1 ; define 5" floppy, double density, 80 track 2 special sided, unit 3 dw 0 ; no alternate DPB dw fdwrit dw fdread dw fdlgin dw fdinit db mdsel+unit3 ; physical unit 3 db 0 md4x11 dph 0,dpbmd4x1 page ; Now generate the DPB's for the disk drives cseg ; DPB must be resident in common memory if harddisk if hardsize = 20 ; define 5" hard disk, 20 megabyte (unformatted) ; note that the DPB's for devices over 8MB must be constructed by hand. surf set 6 ; number of surfaces hdsec set 68 ; 68 sectors per surface dpbhd20 dw hdsec*surf ; sectors per track db 5 ; block shift for 4096 block size db 31 ; block mask for 4096 block size db 1 ; extent mask dw 3887 ; max allocation blocks minus 1 dw 2048-1 ; max directory entries minus 1 db 0ffh,0ffh ; directory allocation dw 8000h ; directory ck vector, drive is permanent  dw 1 ; one reserved track db 2 ; physical record shift factor db 3 ; physical record mask endif if hardsize = 15 ; define 5" hard disk, 15 megabyte (unformatted) surf set 4 ; number of surfaces hdsec set 68 ; 68 sectors per surface dpbhd15 dw hdsec*surf ; sectors per track db 5 ; block shift for 4096 block size db 31 ; block mask for 4096 block size db 1 ; extent mask dw 2591 ; max allocation blocks minus 1 dw 2048-1 ; max directory entries minus 1 db 0ffh,0ffh ; directory allocation dw 8000h ; directory ck vector, drive is permanent dw 1 ; one reserved track db 2 ; physical record shift factor db 3 ; physical record mask endif endif ; Wave Mate standard floppy disk defs psec set 5 ; physical sectors/track prec set 1024 ; bytes/physical sector rec set 128 ; size of CP/M physical record rec set 128 ; size of record spt set (prec/rec)*psec ; records/track sides set 2 trk set 80*sides blk set 2048 dir set 128 cks set dir/4 off set 2 ; reserved tracks den set DD ; set double density side set S2 ; set double sided rps set prec/rec ; compute number records/sector srat set mxrate ; set 3 ms step rate ; buffer timeout constants in 1/10 sec rto set 22 ; read buffer data valid timeout const. ; 2.2 sec timeout of read data wto set 19 ; write buffer data valid timeout const ; 1.9 sec timeout of write data wptrk set 0 ; write precomp track number ; define Wave Mate mini-floppy, double density, 80 track 2 side dpbmd8x2 dpb rec,spt,trk,blk,dir,off,cks,den,side,rps,srat,wptrk,rto,wto page ; ; Revised to add different double sided formats. The Wave Mate standard ; double sided disk is configured as follows: ; ; Tracks alternate from side to side on the same cylinder such that ; all even numbered tracks are on side 0, all odd numbered tracks are ; on side 1, all tracks are placed on the disk such that the lowest ; numbered track is at the edge of the disk and the highest is at ; the innermost cylinder. 4; ; TRACK SIDE CYLINDER ; 0 0 0 ; 1 1 0 ; 2 0 1 ; 3 1 1 ; 4 0 2 ; ETC ; ; Alternate approaches are possible and the following scheme is now ; supported: ; ; The first 1/2 of the tracks are on side 0 and the second 1/2 of ; the tracks are on side 1. They are arranged such that on side 0 ; the track number is the same as the cylinder number, on side 1 the ; track number minus the maximum number of cylinders is the same as ; the cylinder number. ; ; TRACK SIDE CYLINDER ; 0 0 0 ; 1 0 1 ; 2 0 2 ; MAX/2-1 0 MAX ; MAX/2 1 0 ; MAX/2+1 1 1 ; MAX/2+2 1 2 ; MAX 1 MAX ; ; Parameters to support alternate diskette side schemes are passed to ; the FDDRV module in the sides flag as follows: ; ; IFF bit 0 = 0, ==> single sided ; IFF bit 0 = 1, ==> double sided ; IFF bit 0 = 1, then: ; IFF bit 1 = 1, ==> Wave Mate standard cylinder scheme ; IFF bit 1 = 0, then bits 2-7 define the scheme ; IFF bit 2 = 1, ==> the first 1/2 of the tracks are on side 0 in ascending ; order and the last 1/2 are on side 1 in ascending order ; with the maximum cylinders being 80. ; bits 3-7 are currently undefined ; page ; define a 5' disk with alternate side scheme ; side set 00000101b ; alternate side scheme ;dpbmdxx1 dpb rec,spt,trk,blk,dir,off,cks,den,side,rps,srat,wptrk,rto,wto ; ; define Wave Mate mini-floppy, double density, 40 track 1 side. sides set 1 trk set 40*sides blk set 1024 dir set 64 cks set dir/4 den set DD side set S1 rps set prec/rec srat set rate0 dpbmd4x1 dpb rec,spt,trk,blk,dir,off,cks,den,side,rps,srat,wptrk,rto,wto ; define 8" double density, single sided disk. psec set 26 ; number of physical sectors prec set 256 ; number bytes/physical sector spt set (prec/rec)*psec ; 128 byte records/track sides set 1 trk set 77*sides blk set 2048 dir set 128 cks set dir/4 den set DD side set S1 rps set prec/rec srat set rate0 dpbfdx1 dpb rec,spt,trk,blk,dir,off,cks,den,side,rps,srat,wptrk,rto,wto ; define 8" double density, double sided disk  sides set 2 trk set 77*sides dir set 256 cks set dir/4 side set s2 dpbfdx2 dpb rec,spt,trk,blk,dir,off,cks,den,side,rps,srat,wptrk,rto,wto ; define 8" double density, single sided disk 1024 byte sectors psec set 8 ; number of physical sectors prec set 1024 ; number bytes/physical sector spt set (prec/rec)*psec ; 128 byte records/track sides set 1 trk set 77*sides blk set 2048 dir set 256 cks set dir/4 den set DD side set S1 rps set prec/rec srat set rate0 dpbfdxk dpb rec,spt,trk,blk,dir,off,cks,den,side,rps,srat,wptrk,rto,wto ; define 8" double density, double sided disk 1024 byte sectors sides set 2 trk set 77*sides side set s2 dpbfdxl dpb rec,spt,trk,blk,dir,off,cks,den,side,rps,srat,wptrk,rto,wto ; define 8" single density, single sided, drive. den set SD side set s1 rps set 1 srat set rate0 dir set 64 cks set dir/4 wptrk set 0ffh ; no precomp on single density disk dpbfsx1 dpb 128,26,77,1024,dir,off,cks,den,side,rps,srat,wptrk,rto,wto page ; set up a standard sector translation table for 8" IBM diskette: trans skew 26,6,1 end 5 ; equates for mode byte bit fields mb$input equ 0000$0001b ; device may do input mb$output equ 0000$0010b ; device may do output mb$in$out equ mb$input+mb$output mb$soft$baud equ 0000$0100b ; software selectable ; baud rates mb$serial equ 0000$1000b ; device may use protocol mb$xon$xoff equ 0001$0000b ; XON/XOFF protocol ; enabled baud$none equ 0 ; no baud rate associated ; with this device baud$50 equ 1 ; 50 baud baud$75 equ 2 ; 75 baud baud$110 equ 3 ; 110 baud baud$134 equ 4 ; 134.5 baud baud$150 equ 5 ; 150 baud baud$300 equ 6 ; 300 baud baud$600 equ 7 ; 600 baud baud$1200 equ 8 ; 1200 baud baud$1800 equ 9 ; 1800 baud baud$2400 equ 10 ; 2400 baud baud$3600 equ 11 ; 3600 baud baud$4800 equ 12 ; 4800 baud baud$7200 equ 13 ; 7200 baud baud$9600 equ 14 ; 9600 baud baud$19200 equ 15 ; 19.2k baud ; @CHK MACRO USED FOR CHECKING 8 BIT DISPLACMENTS ; @CHK MACRO ?DD ;; USED FOR CHECKING RANGE OF 8-BIT DISP.S IF (?DD GT 7FH) AND (?DD LT 0FF80H) 'DISPLACEMENT RANGE ERROR - Z80 LIB' ENDIF ENDM LDX MACRO ?R,?D @CHK ?D DB 0DDH,?R*8+46H,?D ENDM LDY MACRO ?R,?D @CHK ?D DB 0FDH,?R*8+46H,?D ENDM STX MACRO ?R,?D @CHK ?D DB 0DDH,70H+?R,?D ENDM STY MACRO ?R,?D @CHK ?D DB 0FDH,70H+?R,?D ENDM MVIX MACRO ?N,?D @CHK ?D DB 0DDH,36H,?D,?N ENDM MVIY MACRO ?N,?D @CHK ?D DB 0FDH,36H,?D,?N ENDM LDAI MACRO DB 0EDH,57H ENDM LDAR MACRO DB 0EDH,5FH ENDM STAI MACRO DB 0EDH,47H ENDM STAR MACRO DB 0EDH,4FH ENDM LXIX MACRO ?NNNN DB 0DDH,21H DW ?NNNN ENDM LXIY MACRO ?NNNN DB 0FDH,21H DW ?NNNN ENDM LDED MACRO ?NNNN DB 0EDH,5BH DW ?NNNN ENDM LBCD MACRO ?NNNN DB 0EDH,4BH DW ?NNNN ENDM LSPD MACRO ?NNNN DB 0EDH,07BH DW ?NNNN ENDM LIXD MACRO ?NNNN DB 0DDH,2AH DW ?NNNN ENDM LIYD MACRO ?NNNN DB 0FDH,2AH DW ?NNNN ENDM SBCD MACRO ?NNNN DB 0EDH,43H DW ?NNNN ENDM SDED MACRO ?NNNN DB 0EDH,53H DW ?NNNN ENDM SSPD MACRO ?NNNN DB 0EDH,73H DW ?NNNN ENDM SIXD MACRO ?NNNN DB 0DDH,22H DW ?NNNN ENDM SIYD MACRO ?NNNN DB 0FDH,22H DW ?NNNN ENDM SPIX MACRO DB 0DDH,0F9H ENDM SPIY MACRO DB 0FDH,0F9H ENDM PUSHIX MACRO DB 0DDH,0E5H ENDM PUSHIY MACRO DB 0FDH,0E5H ENDM POPIX MACRO DB 0DDH,0E1H ENDM POPIY MACRO DB 0FDH,0E1H ENDM EXAF MACRO DB 08H ENDM EXX MACRO DB 0D9H ENDM XTIX MACRO DB 0DDH,0E3H ENDM XTIY MACRO DB 0FDH,0E3H ENDM LDI MACRO DB 0EDH,0A0H ENDM LDIR MACRO DB 0EDH,0B0H ENDM LDD MACRO DB 0EDH,0A8H ENDM LDDR MACRO DB 0EDH,0B8H ENDM CCI MACRO DB 0EDH,0A1H ENDM CCIR MACRO DB 0EDH,0B1H ENDM CCD MACRO DB 0EDH,0A9H ENDM CCDR MACRO DB 0EDH,0B9H ENDM ADDX MACRO ?D @CHK ?D DB 0DDH,86H,?D ENDM ADDY MACRO ?D @CHK ?D DB 0FDH,86H,?D ENDM ADCX MACRO ?D @CHK ?D DB 0DDH,8EH,?D ENDM ADCY MACRO ?D @CHK ?D DB 0FDH,8EH,?D ENDM SUBX MACRO ?D @CHK ?D DB 0DDH,96H,?D ENDM SUBY MACRO ?D @CHK ?D DB 0FDH,96H,?D ENDM SBCX MACRO ?D @CHK ?D DB 0DDH,9EH,?D ENDM SBCY MACRO ?D @CHK ?D DB 0FDH,9EH,?D ENDM ANDX MACRO ?D @CHK ?D DB 0DDH,0A6H,?D ENDM ANDY MACRO ?D @CHK ?D DB 0FDH,0A6H,?D ENDM XORX MACRO ?D @CHK ?D DB 0DDH,0AEH,?D ENDM XORY MACRO ?D @CHK ?D DB 0FDH,0AEH,?D ENDM ORX MACRO ?D @CHK ?D DB 0DDH,0B6H,?D ENDM ORY MACRO ?D @CHK ?D DB 0FDH,0B6H,?D ENDM CMPX MACRO ?D @CHK ?D DB 0DDH,0BEH,?D ENDM CMPY MACRO ?D @CHK ?D DB 0FDH,0BEH,?D ENDM INRX MACRO ?D @CHK ?D DB 0DDH,34H,?D ENDM INRY MACRO ?D @CHK ?D DB 0FDH,34H,?D ENDM DCRX MACRO ?D @CHK ?D DB 0DDH,035H,?D ENDM DCRY MACRO ?D @CHK ?D DB 0FDH,35H,?D ENDM NEG MACRO DB 0EDH,44H ENDM IM0 MACRO DB 0EDH,46H ENDM IM1 MACRO DB 0EDH,56H ENDM IM2 MACRO DB 0EDH,55EH ENDM BC EQU 0 DE EQU 2 HL EQU 4 IX EQU 4 IY EQU 4 DADC MACRO ?R DB 0EDH,?R*8+4AH ENDM DSBC MACRO ?R DB 0EDH,?R*8+42H ENDM DADX MACRO ?R DB 0DDH,?R*8+09H ENDM DADY MACRO ?R DB 0FDH,?R*8+09H ENDM INXIX MACRO DB 0DDH,23H ENDM INXIY MACRO DB 0FDH,23H ENDM DCXIX MACRO DB 0DDH,2BH ENDM DCXIY MACRO DB 0FDH,2BH ENDM BIT MACRO ?N,?R DB 0CBH,?N*8+?R+40H ENDM SETB MACRO ?N,?R DB 0CBH,?N*8+?R+0C0H ENDM RES MACRO ?N,?R DB 0CBH,?N*8+?R+80H ENDM BITX MACRO ?N,?D @CHK ?D DB 0DDH,0CBH,?D,?N*8+46H ENDM BITY MACRO ?N,?D @CHK ?D DB 0FDH,0CBH,?D,?N*8+46H ENDM SETX MACRO ?N,?D @CHK ?D DB 0DDH,0CBH,?D,?N*8+0C6H ENDM SETY MACRO ?N,?D @CHK ?D DB 0FDH,0CBH,?D,?N*8+0C6H ENDM RESX MACRO ?N,?D @CHK ?D DB 0DDH,0CBH,?D,?N*8+86H ENDM RESY MACRO ?N,?D @CHK ?D DB 0FDH,0CBH,?D,?N*8+86H ENDM JR MACRO ?N DB 18H,?N-$-1 ENDM JRC MACRO ?N DB 38H,?N-$-1 ENDM JRNC MACRO ?N DB 30H,?N-$-1 ENDM JRZ MACRO ?N DB 28H,?N-$-1 ENDM JRNZ MACRO ?N DB 20H,?N-$-1 ENDM DJNZ MACRO ?N DB 10H,?N-$-1 ENDM PCIX MACRO DB 0DDH,0E9H ENDM PCIY MACRO DB 0FDH,0E9H ENDM RETI MACRO DB 0EDH,4DH ENDM RETN MACRO DB 0EDH,45H ENDM INP MACRO ?R DB 0EDH,?R*8+40H ENDM OUTP MACRO ?R DB 0EDH,?R*8+41H ENDM INI MACRO DB 0EDH,0A2H ENDM INIR MACRO DB 0EDH,0B2H ENDM IND MACRO DB 0EDH,0AAH ENDM INDR MACRO DB 0EDH,0BAH ENDM OUTI MACRO DB 0EDH,0A3H ENDM OUTIR MACRO DB 0EDH,0B3H ENDM OUTD MACRO DB 0EDH,0ABH ENDM OUTDR MACRO DB 0EDH,0BBH ENDM RLCR MACRO ?R DB 0CBH, 00H + ?R ENDM RLCX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 06H ENDM RLCY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 06H ENDM RALR MACRO ?R DB 0CBH, 10H+?R ENDM RALX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 16H ENDM RALY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 16H ENDM RRCR MACRO ?R DB 0CBH, 08H + ?R ENDM RRCX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 0EH ENDM RRCY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 0EH ENDM RARR MACRO ?R DB 0CBH, 18H + ?R ENDM RARX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 1EH ENDM RARY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 1EH ENDM SLAR MACRO ?R DB 0CBH, 20H + ?R ENDM SLAX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 26H ENDM SLAY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 26H ENDM SRAR MACRO ?R DB 0CBH, 28H+?R ENDM SRAX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 2EH ENDM SRAY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 2EH ENDM SRLR MACRO ?R DB 0CBH, 38H + ?R ENDM SRLX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 3EH ENDM SRLY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 3EH ENDM RLD MACRO DB 0EDH, 6FH ENDM RRD MACRO DB 0EDH, 67H ENDM  TITLE 'CHARACTER I/O HANDLERS FOR BULLET SBC' ;********************************************************************** ; ; THIS IS AN UNPUBLISHED WORK WHICH IS THE PROPERTY OF WAVE MATE, INC. ; THIS WORK CONTAINS PROPRIETARY INFORMATION AND IS PROVIDED UNDER A ; CONFIDENTIAL RELATIONSHIP FOR A SPECIFIC PURPOSE. THE RECIPENT, BY ; ACCEPTANCE, ASSUMES CUSTODY THEREOF AND AGREES NOT TO DISCLOSE OR ; TRANSFER THIS WORK IN WHOLE OR IN PART WITHOUT WRITTEN PERMISSION OF ; WAVE MATE, INC.; 14009 S. CRENSHAW BLVD.; HAWTHORNE, CA 90250; USA ; ;********************************************************************** ;* THIS MODULE PERFORMS ALL CHARACTER I/O FUNCTIONS FOR CP/M PLUS on the BULLET SBC ;* ;* A TABLE OF DEVICE NAMES AND CHARACTERISTICS IS DEFINED HEREIN ;* ;* THE GLOBAL SUBROUTINE 'INISTM' IS CONTAINED IN THIS MODULE ;* IT IS USED TO SEND A STREAM OF INITIALIZATION DATA TO ANY ;* NUMBER OF I/O PORTS ON THE SYSTEM. ;* LAST EDIT 8-1-83, 09:01, BY DENNIS PAINTER. ;**************************************** ;* * ;* ASSIGNMENTS AND DEFINITIONS * ;* * ;**************************************** ; BOOLEAN SCALARS: FALSE EQU 0 TRUE EQU NOT FALSE M80 EQU true ; SELECT PROPER ASSEMBLER IF M80 .Z80 .SFCOND ELSE LIST NOCOND ENDIF ; ; ; Entry points for BIOS functions supported in this module. ; ENTRY ?CINIT ; ; ; Indirect entry points for BIOS functions entered from BIOSKRNL. ; ENTRY ?CI,?CO,?CIST,?COST ; ; ; External BIOS functions used by this module. ; EXTRN ?BNKSL ; ; ; External data object referenced by CHARIO. ; EXTRN @CBNK ; ; ; Internal data objects referenced by BIOSKRNL. ; ENTRY @CTBL ; ; ; Internal subroutine used by various CBIOS modules. ; ENTRY INISTM ; ; ; Default interrupt handler. ; ENTRY UNKINT ; ; DART/SIO channel A interrupt vector handler addresses: ; ENTRY IVS0XT,IVS0ST,IVS0RC,IVS0SP ; ; ; Device interrupt handler offsets on interrupt vector page. ; EXTRN SIO6IRV,CTCIRV ; ; ; System Control Block (SCB) variables accessed directly. ; EXTRN @FX,@MXTPA ; ; SPECIAL CHARACTERS AND ASSIGNMENTS: EOF EQU 1AH ; CP/M END OF FILE CHAR (CONTROL Z) CNTRLC EQU 'C'-040H BAUD$9600 EQU 14 BAUD$300 EQU 6 BAUD$NONE EQU 0 MB$INPUT EQU 00000001B ; DEVICE MAY DO INPUT MB$OUTPUT EQU 00000010B ; DEVICE MAY DO OUTPUT MB$IN$OUT EQU MB$INPUT+MB$OUTPUT MB$SOFTBAUD EQU 00000100B ; SOFTWARE SELECTABLE BAUD RATE MB$SERIAL EQU 00001000B ; DEVICE MAY USE PROTOCOL MB$XON$XOFF EQU 00010000B ; XON/XOFF PROTOCOL ENABLED IF M80 INCLUDE IOEQUS.Z80 ELSE *INCLUDE IOEQUS.Z80 ENDIF IF M80 PAGE ELSE FORM ENDIF IF M80 CSEG ELSE REL ENDIF ;******************************************************************* ;* ;* DEFINE THE DEVICE NAMES RECOGNIZED BY THE SYSTEM AND THEIR CHARACTERISTICS. ;* ;******************************************************************* @CTBL: DB 'CRT ' ; DEVICE 0, CRT OR CONSOLE DB MB$IN$OUT+MB$SERIAL+MB$SOFTBAUD C0BAUD: DB BAUD$NONE ; LET CONBAUD.SYS DETERMINE IT DB 'LPT ' ; DEVICE 1, SERIAL LINE PRINTER DB MB$IN$OUT+MB$SERIAL+MB$SOFTBAUD+MB$XON$XOFF C1BAUD: DB BAUD$9600 DB 'CEN ' ; DEVICE 3, CENTRONICS PARALLEL DB MB$OUTPUT DB BAUD$NONE CTBLEND EQU $ DB 0 ; TABLE TERMINATOR MAX$DEVICES EQU (CTBLEND-@CTBL)/8 IF M80 PAGE ELSE FORM ENDIF ;******************************************************** ;* * ;* CONSOLE AND LIST DEVICE I/O * ;* * ;******************************************************** ; ; ?CI -- CHARACTER INPUT FROM DEVICE NUMBER IN REGISTER (B). ; ?CI: INC B ; MAKE DEVICE NUMBER 1 RELATIVE DJNZ CI1 ; TEST FOR DEVICE ZERO. ; CONIN -- CONSOLE CHARACTER INPUT. ; ; ENTERS: NO PARAMETERS. ; RETURNS: A = CHARACTER (PARITY BIT = 0). ; A,HL,DE REGISTERS ALTERED. CONIN: LD HL,RNGCNT ; POINT TO RING BUFFER COUNTER EI XOR A ; CLEAR COUNT CONIN1: OR (HL) ; GET RING BUFFER COUNT JR Z,CONIN1 ; B/ BUFFER EMPTY. DI DEC (HL) ; ADJUST FOR REMOVING THIS ONE. LD DE,(RNGOUT) ; GET OUTPUT POINTER LD A,(DE) ; A = RING BUFFER OUTPUT CHAR (PARITY AND 07FH ; RESET). ("AND" INSTRUCTION RESETS CARRY). CP 03H ; CTRL C? JR Z,CONIN5 ; B/ YES. CP 11H ; CTRL Q? JR Z,CONIN5 ; B/ YES CP 13H ; CTRL S? JR NZ,CONIN2 ; B/ NO CONIN5: INC HL ; POINT TO CTRL C COUNT DEC (HL) CONIN2: AND A ; CLEAR CARRY BIT LD HL,RNGEND ; BUMP RING BUFFER OUTPUT POINTER. SBC HL,DE ; (IF END OF RING BUFFER REACHED, INC DE ; ADVANCE POINTER. JR NZ,CONIN3 ; B/ NOT PAST END, SAVE IT LD DE,RNGBEG ; RESET POINTER TO BEGINNING.) CONIN3: LD (RNGOUT),DE EI RET CI1: DJNZ CI2 ; TEST IF DEVICE IS #1. ; PROCESS DEVICE ONE ; AUXIN -- RETURNS INPUT FROM 2ND SERIAL PORT. AUXIN: CALL AUXIST ; CK IF CHARACTER AVAILABLE JR Z,AUXIN ; WAIT UNTIL ONE IS IN A,(LPTDAT) ; INPUT THE CHARACTER. AND 07FH ; MASK HIGH BIT OFF. RET CI2: ; CENTRONICS IS DEVICE 2, NOT CAPABLE OF INPUT. LD A,EOF ; RETURN EOF TOKEN.  RET IF M80 PAGE ELSE FORM ENDIF ; ; ?CO -- CHARACTER OUTPUT TO DEVICE NUMBER IN REGISTER (B) ; CHARACTER TO OUTPUT IS IN REGISTER (C). ; ?CO: INC B ; MAKE DEVICE NUMBER 1 RELATIVE DJNZ CO1 ; TEST FOR DEVICE ZERO ; PROCESS DEVICE ZERO ; CONOUT -- CONSOLE OUTPUT ROUTINE ; ; ENTRY PARMS: C = CHARACTER TO PRINT AT CONSOLE ; CONOUT: LD A,(RBCB0+1) ; GET # CHAR IN OUTPUT BUFFER CP RB0SIZ ; SEE IF BUFFER IS ALREADY FULL JR Z,CONOUT ; B/ LOOP IF FULL DI ld a,(IXTFLG) and a jr z,cnot3 LD HL,(RB0IN) ; GET INPUT POINTER LD (HL),C ; SAVE CHARACTER IN RING BUFFER LD A,(RBCB0+1) ; GET COUNT INC A ; BUMP COUNT OF CHAR IN RING BUFFER LD (RBCB0+1),A ; AND SAVE EI ; LET INTERUPTS PICK OFF CHARACTERS INC HL ; ADVANCE RING BUFFER POINTER LD (RB0IN),HL ; SAVE NEW RING BUFFER POINTER LD DE,RB0END+1 ; NOW TEST FOR WRAP AROUND SBC HL,DE RET NZ ; RET/ NO WRAP LD HL,RB0BEG LD (RB0IN),HL RET CNOT3: LD A,CCSWRSL1 ; CHNL CTRL SIO SELECT WRITE REG 1. OUT (CRTCTL),A ; NEXT BYTE GOES TO SIO REG 1. LD A,11010011B ; CNNL CTRL SIO INTERRUPT ON INPUTS. OUT (CRTCTL),A CNOT4: IN A,(CRTSTS) AND CRTTBE JR Z,CNOT4 LD A,C OUT (CRTDAT),A ld a,-1 ld (IXTFLG),a EI RET IF M80 PAGE ELSE FORM ENDIF CO1: DJNZ CO2 ; TEST IF DEVICE IS #1. ; PROCESS DEVICE ONE ; AUXOUT -- OUTPUT CHARACTER IN C TO 2ND SERIAL PORT. ; AUXOUT: CALL AUXOST ; WAIT UNTIL TRANSMIT REGISTER EMPTY. JR Z,AUXOUT ; LOOP, NOT EMPTY. LD A,C OUT (LPTDAT),A ; TRANSMIT CHARACTER. RET CO2: DJNZ CO3 ; TEST IF DEVICE IS #2. ; ; PROCESS DEVICE TWO ; CENTRONICS PARALLEL OUTPUT ROUTINE. ; ; ENTERS: C = CHARACTER TO OUTPUT TO PRINTER. LISTC: CALL LSTTST ; CK IF LIST DEVICE READY. JR Z,LISTC ; LOOP UNTIL NOT BUSY LD A,(RVFLAG) ; CK IF BOARD IS REV E AND A LD A,C ; PUT OUTPUT DATA IN A RET JR NZ,LSTC1 ; B/ BOARD IS REV E OUT (PIOADAT),A ; OUTPUT TO PORT A DATA REGISTER RET LSTC1: OUT (15H),A ; PUT DATA INTO LATCH IN A,(1BH)6 ; SEND STROBE PULSE CO3: RET IF M80 PAGE ELSE FORM ENDIF ; ; ?CIST -- CHARACTER INPUT STATUS FROM DEVICE NUMBER IN REGISTER (B). ; ?CIST: INC B ; MAKE DEVICE NUMBER 1 RELATIVE. DJNZ CIS1 ; TEST FOR DEVICE ZERO. ; PROCESS DEVICE ZERO ; CONST -- CONSOLE INPUT STATUS CHECK. ; ; ENTERS: NO PARAMETERS. ; RETURNS: A = 00, Z=1 IF NO CHARACTER AVAILABLE ; A = FFH, Z=0 IF AT LEAST ONE CHAR AVAILABLE CONST: LD A,(RNGCNT) ; TEST FOR ANY CHARACTERS IN BUFFER OR A ; IF NONE, EASY RETURN RET Z ; RETURN NOTHING NOP ; IF YOU HAVE TROUBLE WITH CONSOLE ; INPUT CHARGE THIS NOP TO A RET ; TYPE AHEAD MAY NOT WORK AS GOOD; HOWEVER. LD HL,(@MXTPA) ; CK IF STACK IS IN USER SPACE SBC HL,SP ; IF SO, MUST BE DIRECT BIOS CALL JR NC,CONST3 ; B/ DIRECT BIOS CALL, RET TRUE STATUS LD A,(@FX) ; BDOS CALL GOT HERE, WHAT WAS FUNCT? CP 6 ; IF DIRECT CONSOLE I/O, MUST RET TRUE JR Z,CONST3 ; STATUS TO CALLER CP 11 ; IF GET CONSOLE STATUS JR NZ,CONST5 LD HL,@MXTPA ; INDEX THE SCB AND CK MODE LD DE,-(62H-33H) ADD HL,DE ; HL@ CONSOLE MODE LS BYTE BIT 0,(HL) ; CK IF CTL C ONLY ON FUNCT 11 JR Z,CONST3 ; B/ NO, NORMAL STATUS CONST5: LD A,C ; GET LIARS FLAG PASSED IN FROM OR A ; THE BIOSKRNL MODULE RET NZ ; TELL TRUTH IF TESTING FOR CONIN LD A,(RNGCNT+1) ; TEST FOR CTRL CHARS OR A ; TO SUPPORT XON, XOFF RET Z ; NONE, SO SAY NOTHING CONST3: OR 0FFH RET ; TELL TRUTH IF ^C, ^S, ^Q IF M80 PAGE ELSE FORM ENDIF CIS1: DJNZ CIS2 ; TEST IF DEVICE IS #1. ; PROCESS DEVICE ONE ; AUXIST -- AUXILIARY INPUT STATUS ; ; ENTERS: NO PARAMETERS ; RETURNS: A = 0, Z = 1 IF NOT READY ; A = FFH, Z = 0 IF CHARACTER AVAILABLE AUXIST: IN A,(LPTSTS) ; GET STATUS AND LPTDAV RET Z ; NOT READY OR 0FFH ; RETURN A = FFH RET ; CHARACTER AVAILABLE CIS2: ; PROCESS DEVICE TWO, IF HIGHER, NO SUCH DEVICE ; CENTRONICS NOT CAPABLE OF INPUT, RET NOT READY. XOR A ; RETURN NOT READY RET ; AND RETURN THEM TO CALLER. IF M80 PAGE ELSE FORM ENDIF ; ?COST -- CHARACTER OUTPUT STATUS FROM DEVICE NUMBER IN REGISTER (B). ; ?COST: INC B ; MAKE DEVICE NUMBER 1 RELATIVE DJNZ COS1 ; TEST FOR DEVICE ZERO. ; PROCESS DEVICE ZERO ; CNOST -- CONSOLE OUTPUT STATUS CHECK. ; ; ENTERS: NO PARAMETERS ; RETURNS: A = 00, Z = 1 IF NOT READY ; A = FFH, Z = 0 IF READY FOR OUTPUT CNOST: LD A,(RBCB0+1) ; GET RING BUFFER COUNT CP RB0SIZ ; BUFFER FULL? LD A,0FFH ; ASSUME READY RET NZ XOR A ; NOT READY RET COS1: DJNZ COS2 ; TEST IF DEVICE IS #1. ; PROCESS DEVICE ONE ; AUXOST -- AUXILIARY OUTPUT STATUS. ; ; ENTERS: NO PARAMETERS ; RETURNS: A = 0, Z = 1 IF NOT READY ; A = FFH, Z = 0 IF READY FOR OUTPUT AUXOST: IN A,(LPTSTS) ; GET STATUS AND LPTTBE RET Z ; NOT READY OR 0FFH ; RETURN A = FFH IF RET ; READY FOR OUTPUT COS2: DJNZ COS3 ; TEST IF DEVICE IS #2. ; PROCESS DEVICE TWO ; PARALLEL PORT TEST FOR READY. ; ; ENTERS: NO PARAMETERS. ; RETURNS: A = 0FFH, Z = 0 IFF LIST DEVICE READY FOR NEXT CHAR. ; A = 0, Z = 1 IFF LIST DEVICE NOT READY. LSTTST: LD A,(RVFLAG) ; GET BOARD REVISION FLAG AND A ; CK IF REV B, C, OR C1 IN A,(PIOBDAT) ; GET STATUS BITS JR Z,LSTT1 ; B/ REVISION FLAG NOT REV E RLA RLA RLA ; SHIFT BIT 6 INTO BIT 0 FOR TEST LSTT1: AND 1H ; GET BUSY BIT DEC A ; SET FLAGS FOR BUSY/*BUSY RET COS3: XOR A ; RETURN NOT READY RET IF M80 PAGE ELSE FORM ENDIF ; ; IVS0TC -- CONSOLE OUTPUT INTERRUPT SERVICE ROUTINE. ; IVS0XT: LD (USRSK2),SP ; SWITCH TO LOCAL STACK LD SP,OWNSK2 PUSH AF PUSH BC PUSH HL LD BC,(RBCB0) ; LOAD Ring Buffer Control Block 0.. LD A,B ; GET COUNT IN BUFFER AND A ; TEST IF BUFFER EMPTY JP NZ,IVTC1 ; B/ not, output a char LD A,28H ; reset transmit int pending command INC C ; POINT TO SIO CONTROL PORT OUT (C),A ; AND TURN OFF INTERRUPTS xor a ld (IXTFLG),a JR IVTC4 ; EXIT.. IVTC1: LD HL,(RB0OUT) ; GET Ring Buffer 0 OUTput pointer.. OUTI ; Output buffer data & dec count LD A,B ; Get new count (count=count-1) LD (RBCB0+1),A ; SAVE NEW COUNT LD (RB0OUT),HL ; SAVE NEW BUFFER POINTER LD BC,RB0END+1 ; GET TOP OF RING BUFFER XOR A ; CARRY CLEAR SBC HL,BC JP NZ,IVTC4 ; IF BUFFER DID NOT WRAP, EXIT LD HL,RB0BEG ; WRAPPED, SET START POINTER LD (RB0OUT),HL IVTC4: POP HL POP BC POP AF LD SP,(USRSK2) EI RETI RB0SIZ EQU 250 RBCB0: DB CRTDAT ; SIO DATA PORT DB 0 ; RING BUFFER CONTENTS COUNT RB0IN: DW RB0BEG ; Ring Buffer 0 INput pointer RB0OUT: DW RB0BEG ; RING BUFFER 0 OUTPUT POINTER.. RB0BEG: DEFS RB0SIZ+1 ; Ring Buffer 0 data area RB0END EQU $-1 IXTFLG: DB 0 IF M80 PAGE ELSE FORM ENDIF ; IVS0RC -- CONSOLE KEYBOARD INTERRUPT SERVICE ROUTINE. USES LOCAL ; STACK TO CONSERVE USER PROGRAM STACK AREA. ; NOTE USE OF ABSOLUTE JUMPS TO INCREASE SPEED OF ISR. IVS0RC: LD (USRSK2),SP ; SWITCH FROM USER TO LOCAL STACK. LD SP,OWNSK2 PUSH AF ; SAVE REGISTER CONTENTS. PUSH DE PUSH HL LD A,(BRKFLG) ; DID WE JUST GET A BREAK7 BIT 0,A JP Z,KBDIR5 ; B/ NO XOR A ; YES, CLR BREAK FLAG LD (BRKFLG),A IN A,(CRTDAT) ; FLUSH NULL FROM DART JR KBDIR3 ; EXIT KBDIR5: LD HL,RNGCNT ; POINT TO COUNT OF # CHAR IN BUFFER LD A,(HL) ; GET CHARACTER COUNT CP RNGEND-RNGBEG ; CK IF BUFFER FULL IN A,(CRTDAT) ; GET INPUT CHARACTER (CLR INTERRUPT) JR Z,KBDIR3 ; B/ BUFFER FULL, DISCARD CHARACTER INC (HL) ; BUMP COUNT OF CHAR IN BUFFER AND 07FH ; MASK OFF PARITY BIT CP 13H ; CTRL S? JR Z,KBDIR4 ; B/ YES JP NC,KBDIR1 ; B/ CAN'T BE CTRL Q OR CTRL C. CP 11H ; CTRL Q? JR Z,KBDIR4 ; B/ YES CP 3 ; TEST FOR CONTROL C. JP NZ,KBDIR1 ; B/ NOT CONTROL C. LD (HL),1 ; FLUSH BUFFER INC HL LD (HL),1 LD HL,RNGBEG LD (RNGIN),HL LD (RNGOUT),HL JR KBDIR1 KBDIR4: INC HL ; POINT TO CONTROL C COUNT. INC (HL) ; BUMP CONTROL C COUNT. LD HL,(RNGOUT) EX DE,HL LD HL,RNGBEG AND A SBC HL,DE DEC DE JR NZ,KBDIR7 LD DE,RNGEND KBDIR7: LD (DE),A ; SAVE CRTL Q/S AT START OF BUFFER LD (RNGOUT),DE JR KBDIR3 KBDIR1: LD HL,(RNGIN) ; GET RING BUFFER INPUT POINTER. LD (HL),A ; AND SAVE INPUT CHAR IN BUFFER. AND A ; CLEAR CARRY BIT EX DE,HL ; SAVE INPUT POINTER IN DE. LD HL,RNGEND ; GET BUFFER END FOR WRAP AROUND TEST SBC HL,DE ; TEST FOR BUFFER POINTER WRAP INC DE ; ADVANCE BUFFER POINTER JP NZ,KBDIR2 ; B/ DID NOT WRAP AROUND. LD DE,RNGBEG ; WRAPPED, RESET TO START. KBDIR2: LD (RNGIN),DE ; SAVE NEW BUFFER POINTER. KBDIR3: POP HL ; RESTORE USER REGISTERS POP DE POP AF LD SP,(USRSK2) ; AND USER STACK. ; DEFAULT UNKNOWN INTERRUPT PROCESSOR UNKINT: EI ; RETURN FROM INTERRUPT. RETI ; ; Interrupt handler for BREAK. ; IVS0ST: ; BREAK is External Status. LD (USRSK2),SP ; SWITCH FROM USER TO LOCAL STACK. LD SP,OWNSK2 PUSH AF ; SAVE REGISTER CONTENTS. PUSH DE PUSH HL LD A,CCSWRSL0 ; SELECT REGISTER 0 OUT (CRTCTL),A IN A,(CRTSTS) ; GET RR0 BITS ld d,a ; save them LD A,CCSWRSL0 ; SELECT REGISTER 0 OUT (CRTCTL),A LD A,00010000B ; RESET EXT/STATUS INTERRUPTS OUT (CRTCTL),A ld a,(brkflg) ; get break state xor d ; test for break transition bit 7,a JR Z,KBDIR3 ; B/ NOT A BREAK ld a,-1 ; Get break flag bit 7,d ; break flag set? jr nz,brk3 ; b/ no, set it ld a,0 ; clear break flag brk3: LD (BRKFLG),A JR KBDIR3 ; ; INTERRUPT HANDLER FOR SPECIAL CONDITIONS (PARITY ERROR, FRAMING ERROR) ; IVS0SP: LD (USRSK2),SP ; SWITCH FROM USER TO LOCAL STACK. LD SP,OWNSK2 PUSH AF ; SAVE REGISTER CONTENTS. LD A,CCSWRSL1 ; SET POINTER TO REGISTER 1 OUT (CRTCTL),A IN A,(CRTSTS) ; READ REGISTER 1 (CLR INTERRUPT) LD A,CCSWRSL0 ; SELECT REGISTER 0 OUT (CRTCTL),A ld a,00110000b ; issue error reset out (crtctl),a IN A,(CRTDAT) ; CLEAR OUT GARBAGE CHAR POP AF LD SP,(USRSK2) ; RESTORE USERS STACK POINTER EI RETI IF M80 PAGE ELSE FORM ENDIF ;******************************************************************** ;* ;* GLOBAL SUBROUTINE TO INITIALIZE ANY I/O DEVICE ON THE SYSTEM ;* ;******************************************************************** ; ; INISTM -- INITIALIZE I/O DEVICES FROM TABLES: ; ; ENTERS: HL = ADDRESS OF DATA TABLE OF FORM: ; ; TABLE FORM: END OF TABLE SIGNIFIED BY A NULL. ; 1ST BYTE IN TABLE IS LENGTH OF DATA TO OUTPUT. ; 2ND BYTE IS I/O PORT ADDRESS. ; 3RD THROUGH N BYTES ARE DATA TO SEND TO PORT. ; INISTM: LD A,(HL) ; CHECK FOR END OF TABLE OR A RET Z ; RETURN ON (HL) @ NULL. LD B,A ; GET TABLE LENGTH IN BYTE COUNTER. INC HL ; BUMP TABLE POINTER. LD C,(HL) ; GET I/O PORT ADDRESS. INC HL ; POINT TO DATA BYTES OTIR ; SEND TO I/O PORT. JR INISTM ; REPEAT FOR NEXT TABLE ENTRY. IF M80 PAGE ELSE FORM ENDIF RVFLAG: DEFS 1 ; FLAG = 0FFH IFF BOARD IS REV E ; = 0 IFF BOARD IS REV B, C, OR C1 USRSK2: DEFS 2 ; USER'S STACK POINTER SAVED HERE. DEFS 10H ; LOCAL STACK AREA. OWNSK2 EQU $ BRKFLG: DEFB 0 ; FLAG, BREAK OCCURRED. RNGCNT: DEFB 0 ; COUNT OF CHAR IN RING BUFFER DEFB 0 ; COUNT OF CTRL C IN RING BUFFER RNGIN: DEFW RNGBEG ; CONSOLE RING BUFFER IN POINTER RNGOUT: DEFW RNGBEG ; IF POINTERS SAME, BUFFER EMPTY RNGBEG: DEFS 82 ; KEYBOARD RING BUFFER. RNGEND EQU $-1 IF M80 PAGE ELSE FORM ENDIF ; CINIT -- ON ENTRY REGISTER (C) CONTAINS A LOGICAL UNIT NUMBER ; ; IF THERE IS A PHYSICAL UNIT IN @CTBL FOR THAT LOGICAL UNIT THE ; HARDWARE IS INITIALIZED TO THE BAUD RATE BYTE IN THE TABLE AND ; WHATEVER ELSE INITIALIZATION REQUIRED IS PERFORMED. ; ?CINIT: LD HL,0 ; USE A FEW BYTES OF CALLERS STACK ADD HL,SP ; BY SWAPPING STACKS LD SP,CINSTK ; SET UP OUR OWN STACK IN COMMON PUSH HL ; AND SAVE USERS STACK ON IT. LD A,(@CBNK) ; GET CURRENT BANK PUSH AF ; AND SAVE IT LD A,0 ; SELECT LOGICAL BANK 0 CALL ?BNKSL CALL CINIT ; AND CALL CODE/DATA IN SYSTEM BANK POP AF ; RESTORE PREV BANK STATE CALL ?BNKSL POP HL ; RESTORE USERS STACK LD SP,HL RET DEFS 20 ; LOCAL STACK CINSTK EQU $ ; ; put the rest of CHARIO in the system bank. ; IF M80 DSEG ELSE DATA ENDIF ;7 ; CINIT: LD B,C INC B ; MAKE DEVICE NUMBER 1 RELATIVE DJNZ INIT1 ; TEST IF DEVICE # IS ZERO. ; INITIALIZE DEVICE ZERO LD HL,SIOIRV ; GET DART INTERRUPT VECTOR BASE LD A,CCSWRSL2 ; SELECT WRITE REGISTER 4 OF THE DART OUT (LPTCTL),A ; NEXT BYTE SETS INTERRUPT VECTOR LD A,L ; OFFSET ON VECTOR PAGE OUT (LPTCTL),A ; DART INTERRUPT VECTOR SET ; SET CTC INTERRUPT VECTORS ALSO. LD HL,CTCIRV ; DO VECTORS FOR CTC LD A,L OUT (CTC0),A ; CTC VECTOR PROGRAMMED LD A,CCSWRSL1 ; CHNL CTRL SIO SELECT WRITE REG 1. OUT (CRTCTL),A ; NEXT BYTE GOES TO SIO REG 1. LD A,11010011B ; CNNL CTRL SIO INTERRUPT ON INPUTS. OUT (CRTCTL),A ; PROGRAM BAUD RATES LD A,(C0BAUD) ; GET CHAR DEVICE 0 BAUD BYTE. ; COMPUTE BAUD RATE BYTES CALL BTLKUP ; CALL BAUD TABLE LOOKUP. RET Z ; INVALID BAUD RATE FOR THE BULLET. LD (CTC0BR),A ; SET CTC COUNTER CONSTANT. LD A,B ; GET SIO CONSTANT LD (S1DIV),A ; SET IT ALSO LD HL,SIO1TBL ; POINT TO TABLE OF CONSTANTS INSIO: CALL INISTM ; SEND TO DEVICE. DEC C ; POINT TO DATA PORT IN A,(C) ; CLEAR INPUT CHANNEL IN A,(C) ; OF THE SIO. IN A,(C) RET ; DONE. INIT1: DJNZ INIT2 ; CK FOR DEVICE # 2. LD A,(C1BAUD) ; GET CHAR DEVICE 0 BAUD BYTE. ; COMPUTE BAUD RATE BYTES INIT1B: CALL BTLKUP ; CALL BAUD TABLE LOOKUP. RET Z ; INVALID BAUD RATE FOR THE BULLET. LD (CTC1BR),A ; SET CTC COUNTER CONSTANT. LD A,B ; GET SIO CONSTANT LD (S2DIV),A ; SET IT LD HL,SIO2TBL ; POINT TO TABLE OF CONSTANTS JR INSIO INIT2: DJNZ INIT3 ; CK FOR DEVICE #3 ; ; test for which revision board the software is loaded on ; note: this test should not be done if fddrv is active ld a,0ffh out (18h),a ; write to disk hw control port in a,(19h) ; read hardware status port and 1 ; save bit 0 ld c,a ld a,0 out (18h),a ; see if bit 0 changes in a,(19h) and 1 sub c ; A = FF iff board is rev E ; A = 00 iff board is rev B, C or C1 ld (rvflag),a ; set revision level flag ld hl,piotblc ; point to init table for rev b,c,c1 jr z,init2a ; init rev c board ld hl,piotble ; board is rev e, use that table init2a: call inistm ld hl,rtctbl ; init real time clock CALL INISTM INIT3: RET BTLKUP: AND 0FH RLA ; MUL BY 2 FOR TABLE LOOKUPS LD E,A ; INDEX TABLE OF CTC CONSTANTS LD D,0 ; (IFF CTC CONST = FF, CAN'T SET LD HL,BDTBL ; THIS BAUD RATE.) ADD HL,DE LD A,(HL) CP -1 RET Z ; CANT SET THIS RATE INC HL ; GET SIO DIVISOR LD B,(HL) RET BDTBL: DB -1 ; NONE DB 0 DB -1 ; 50 DB 0 DB 0 ; 75 DB 0C4H DB 174 ; 110 DB 0C4H DB 143 ; 134.5 DB 0C4H DB 0 ; 150 DB 84H DB 80H ; 300 DB 84H DB 40H ; 600 DB 84H DB 20H ; 1200 DB 84H DB -1 ; 1800 DB 0 DB 10H ; 2400 DB 84H DB -1 ; 3600 DB 0 DB 08H ; 4800 DB 84H DB -1 ; 7200 DB 0 DB 04H ; 9600 DB 84H DB 02H ; 19200 DB 84H DB 01H ; 38400 DB 84H DB 01H ; 76800 DB 44H IF M80 PAGE ELSE FORM ENDIF SIO1TBL EQU $ ; CONSOLE DEVICE -- INITIALIZATION ; STREAM TABLE. DEFB SIZE2,CTC0 ; CTC CHANNEL 0 (DART A BAUD RATE) J1 EQU $ DEFB CCCINI0 ; CTC CHANNEL 0 INTIALIZATION WORD CTC0BR: DEFB CCCTC96 ; CONSOLE BAUD RATE OF 9600. SIZE2 EQU $-J1 DEFB SIZE1,CRTCTL ; SIO # 1 CHANNEL A J2 EQU $ ; DEFB CCSRESET ; RESET CHANNEL. DEFB CCSWRSL4 ; SELECT WRITE REGISTER 4. S1DIV: DEFB CCSCKINI ; 32X CLOCK, 1 STOP BIT, NO PARITY. ; DEFB CCSWRSL3 ; SELECT WRITE REGISTER 3 ; DEFB CCSRXINI ; RX 8 BITS, NO HANDSHAKING, RX ENABLE. ; DEFB CCSWRSL5 ; SELECT WRITE REGISTER 5 ; DEFB CCSTXINI ; DTR, TX 8 BITS, TX ENABLE, *RTS LOW. ; DEFB CCSWRSL1 ; SELECT WRITE REGISTER 1. ; DEFB CCSINTIN ; INTERRUPT ON ALL RX CHARS, PARITY. ; DOESN'T AFFECT VECTOR, NO TX OR EXT ; INTERRUPTS. SIZE1 EQU $-J2 DEFB 0 ; TERMINATE TABLE SIO2TBL: DEFB SIZE3,CTC1 ; CTC CHANNEL 1 (DART B BAUD RATE) J3 EQU $ DEFB CCCINI1 ; CTC CHANNEL 1 INITIALIZATION WORD CTC1BR: DEFB CCCTC96 ; SERIAL PORT 2 BAUD RATE OF 9600. SIZE3 EQU $-J3 DEFB SIZE4,LPTCTL ; SIO #1 CHANNEL B J4 EQU $ DEFB CCSRESET ; RESET CHANNEL. DEFB CCSWRSL4 ; SELECT WRITE REGISTER 4. S2DIV: DEFB CCSCKINI ; X32 CLOCK, 1 STOP BIT, NO PARITY. DEFB CCSWRSL3 ; SELECT WRITE REGISTER 3. LPTHS: DEFB 0E1H ; HARDWARE HANDSHAKE ON DB25 PIN 4. ; RX 8 BITS, RX ENABLE. DEFB CCSWRSL5 ; SELECT WRITE REGISTER 5. DEFB CCSTXINI ; DTR, TX 8 BITS, TX ENABLE, *RTS LOW. DEFB CCSWRSL1 ; SELECT WRITE REGISTER 1. DEFB 00000100B ; NO INTERRUPTS, MODIFIED INTERRUPT ; VECTOR (BOTH CHANNELS). SIZE4 EQU $-J4 DEFB 0 ; TERMINATE TABLE IF M80 PAGE ELSE FORM ENDIF ; PIO PORT A INITIALIZATION TABLE FOR REV B, C, & C1 BOARDS PIOTBLC: DEFB SIZE10,PIOACNL ; TABLE LENGTH, PIO PORT LOCATION J5 EQU $ DEFB CCPMOD0 ; SELECT MODE 0 OPERATION DEFB 00000011B ; INTERUPT ENABLE/DISABLE = DISABLE SIZE10 EQU $-J5 ; PIO PORT B INITIALIZATION TABLE DEFB SIZE11,PIOBCNL ; TABLE LENGTH, PIO PORT LOCATION J6 EQU $ DEFB CCPMOD3 ; SELECT MODE 3 OPERATION DEFB 11111111B ; SET ALL PORT B BITS TO INPUTS D8EFB 00110111B ; INTERRUPT CONTROL WORD = DISABLED DEFB 00000001B ; MASK WORD, ONLY MONITOR BIT 0. SIZE11 EQU $-J6 DEFB 0 ; TERMINATE TABLE ; PIO PORT B INITIALIZATION TABLE FOR REV E BOARDS PIOTBLE: DEFB SIZE22,PIOBCNL ; TABLE LENGTH, PIO PORT LOCATION J20 EQU $ DEFB CCPMOD3 ; SELECT MODE 3 OPERATION DEFB 11111111B ; SET ALL PORT B BITS TO INPUTS DEFB 00110111B ; INTERRUPT CONTROL WORD = DISABLED DEFB 00000010B ; MASK WORD, ONLY MONITOR BIT 1. SIZE22 EQU $-J20 DEFB 0 ; TERMINATE TABLE ; REAL TIME CLOCK INITIALIZATION TABLE RTCTBL: DEFB SIZE7,CTC2 ; INTIALIZE CHANNEL 2. J7 EQU $ DEFB CCCINI2 ; CHANNEL 2 INITIALIZATION WORD. DEFB 0 ; TIME CONSTANT = 256. ; ==> TIMER OUTPUT IS 4800 HZ. SIZE7 EQU $-J7 DEFB SIZE5,CTC3 ; INITIALIZE CHANNEL 3. J8 EQU $ DEFB CCCINI3 ; INTERRUPTS ENABLED, COUNTER MODE ; AUTO TRIGGER, TIME CONSTANT FOLLOWS. DEFB 240 ; TIME CONSTANT = 240 ; 4800/240 = 20 TICKS/SECOND. SIZE5 EQU $-J8 DEFB 0 ; TERMINATE TABLE END 1"CP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321͈͋> (12/06/82) CP/M 3 PIP VERS 3.0 DISK READ$DISK WRITE$VERIFY$INVALID DESTINATION$INVALID SOURCE$USER ABORTED$BAD PARAMETER$INVALID USER NUMBER$INVALID FORMAT$HEX RECORD CHECKSUM$FILE NOT FOUND$START NOT FOUND$QUIT NOT FOUND$INVALID HEX DIGIT$CLOSE FILE$UNEXPECTED END OF HEX FILE$INVALID SEPARATOR$NO DIRECTORY SPACE$INVALID FORMAT WITH SPARCE FILE$MAKE FILE$OPEN FILE$PRINTER BUSY$CAN'T DELETE TEMP FILE$ *5<P_lz)<\fp}NO DIRECTORY SPACE$NO DATA BLOCK$CAN'T CLOSE CURRENT EXTENT$SEEK TO UNWRITTEN EXTENT$RANDOM RECORD OUT OF RANGE$RECORDS DON'T MATCH$RECORD LOCKED$INVALID FILENAME$FCB CHECKSUM$2FTe$NONRECOVERABLE$R/O DISK$R/O FILE$INVALID DISK SELECT$INCOMPATIBLE MODE$INVALID PASSWORD$ALREADY EXISTS$LIMIT EXCEEDED$eT     =.:;,<> _[]OUTPRNLSTAXOAUXCONAXIINPNULEOFERROR: $ - $$$$DESTINATION IS R/O, DELETE (Y/N)? $**NOT DELETED**$COPYING -$ (Y/N)? $REQUIRES CP/M 3$CP/M 3 PIP VERSION 3.0$:"Q}#( :}#2m#}1͖-m:m#8ͺk 2#2$M 2"!\#6!z#6:z#b:m#2}#!$6+6+6!o#6!"6!"_#"X#}2d#2g#2h#2c#2z#!n#6!e#6#6!j#6!"6:m#ҹ*ͨͺ!#6:}#͑ ͖%#:d#%# :p#=:p#_HH ":S# N:"H ͵!S#6:d#<"$\( K"#&#( Az:S#:" H҃͵!"6&#,"( Az>!S#Ҕͥ z:S#ʡ!e#6:j#z!f#6:p#,:p# Hͥ :p#,2j#!c#w:S#!$6:$!$6:$!$6:"> !"H!d#"ͥ :"/!f#6:" T!f#6>'!f#Q!f#4<g:" dgA2:j#w"á:m#2}#b! $p+q*$}2{#|2x#!!$q:!$_ ͨ ͨ!#$p+q*"$ !%$p+qͺ*$$DM!|#6|#  !'$p+q*&$!)$p+q$*($ DM!+$p+q**$DM **$DM̈́:{#**$ ~Hi **$!{#6!x#6!-$p+q*,$DM̈́!/$p+q*.$DM̈́DM̈́!1$p+q*0$DM *0$DM̈́!3$p+q*2$DM̈́!5$p+q*4$DM̈́!7$p+q$*6$ ~ *6$ >w! *6$ >w$*6$ DM*6$DM̈́!9$p+q*8$DM *8$DM̈́!;$p+q*:$DM̈́ !<$q!<$:$ʐ :<$2$_ *#Mt *R#Mt *"Mt !>$p+q*=$!DM̈́:{#!@$p+q*?$"DM̈́:{#!B$p+q*A$#!D$p+q*C$$!E$q!E$:\# :E$2\#_,0!J$s+p+q+p+q:J$=2J$^ *F$*H$ w*F$#"F$*H$#"H$7  !z#6:h#~ ͡ "j !h#6:g#Ҕ ͙ "j "͢ !}#6!"6l!K$q_ *K$&) N#Fͺ!N$r+s+q:{#2Q$:x#2R$_ :L$:Q$H !R$6 :R$2R$*L$& N! N#F> !L$~H:Q$H> !Q$/H^  ͨ:Q$=O!r N#F!R$6:R$ {  ͨ*R$&) N#Ft>M$H" *M$~A=Oͨ:ͨ!P$6> !P$ *P$&*M$>2O$ :P$ .ͨ*O$Mͨ!P$4¢ ͺ:Q$:Q$H:Q$H:8Q$H :d#2z#D :R$>!R$~ HH> HD :d#2z#ͥ  m m ͥ !V#:"{ >!V#:"© !U#:"Ғ >!U#:"© !T#:"ҩ >>͙ %#-"( x"( :+#2+#%#! :{#2y# %#j :x# %# "͢ :{#:x#H!" " :{#L:x#D" L" !#6!g#6͡ :"2""! :{#u!h#6:$/:"HҊ!{#6:{#¯:x#§" ï" :"2r#:"2s#:"2t#:"2u#:"2v#:"2w#" 2{#"T#( !"6#6#6#6!"]#:g#ͬ !_#!"Y$>'")!"W$͙ :k#!l#we *W$$ DM" b" k" :a#Ҁ!@"Z# Ë!"Z# W$Y$;">'"W$Y$;"!@*"!a#W$Y$;""Z#!Z#"}O *W$$ DM" :{#" *Z#*W$"W$Ë:$ң !"W$ Y$W$;"ҝ"ͩ 2V$*##"#>'"G!#4!U$6:U$ր!V$ҁ*U$& :U$W$!$ 2V$!U$4L*W$"W$:V$ښ" "Ϳ " *W$$ W$_#;"+s#r{_$( N :a#!@"Z# !"Z# ͡ *X#"]#X#";">'"X#";"!@*"!a#=X#";"!"Z#!Z#"}O *X#*"DM:"2W#"Ϳ :{#:{#n" :a#҇*x#&"*X#"X#!W#:":"րHҦ!"6" n /2k#:a#/!c#" "j !h#6!i#6*X#*"6*Z#*X#"X#![$q:[$ !"4>!$:$!":$1*[$&*S#M! ^#V*[$M̈́ø*[$&ø*[$&ø*[$&ø"_#;"ڄ *_#$ :[$w*_##"_#øg*[$&øAKYgu!\$q:\$ *\$M:$*\$M:"2]$!$:]$!$:]$2]$!]$:$w>!]$!]$5 :\$ (!"6!^$q:^$!$wF ͹O:^$0O͹!_$q:_$O):_$O)!`$6:$2$:$'2$:$'2$:$'2$*$MP*$MP*$MP:$¿:͹ ͹ ͹!a$q:$:a$ :n#9:a$ :a$H9:$2b$(:b$!b$6<:"<2"!b$(!"6 ͹>!$4k!n#6:a$ F!"6*a$M͹:a$ Z!n#6!c$q:c$a/>z!c$/H~:c$_2c$:c$!d$q:d$A/>Z!d$/Hҥ:d$ 2d$:d$!f$6*"M!N ^#Vͥ `"]#;" :e#/!b#!"X#]#@" *_#"X#*]#*"~2e$*]##"]#`5!f$62e$`2e$`̀2e$`"5E:f$ҕ:$Ҁ:o#<2o#2f$Ë:e$ 2f$:f$ҕN :$Ҥ:e$2e$:$ҳ*e$M[: $*e$M͂:e$>!":"=2"> >>!"!"5+N!~# ~2g$!"4ͩ2g$ >>!$;*$Mk8:$2"!$6:"<2"!"6g>!$c*$Mk\!$6!"6> :g$g:g$!h$q:"!h$wO!~# ~2i$—*h$&~# :g$w>!g$:i$¨!"4í!"6>2p#:$X#]#;"!i#:p#!o$62j$:j$::j$:o$" *j$M2j$2j$2l$:j$2k$2j$!l$w:l$D!o$6I!o$6: $!o$x:j$::j$Hu2j$T:*k$M*j$M:l$2m$"p$2n$:l$ʲ!l$52k$Ý" 2j$:j$0O> :j$0:j$AO>" :j$A 2j$OH!m$wO`i"">!$@ ͥ >!$N ͥ *_#}bO2 ͙ "j :{#" :y#:.#:$:{#Y:{#NH{͟O[2{#Ø:{#Yͺ"͢ ͺ:.#2.#:/#2/#%#V %#͢ %##( "0 :&#!r#2&#:'##2'#:(##2(#:)##2)#:-#2-#:.##2.#:/##2/#:0#20#%#V :$}͡ :"2"!"6"V :b#ڦ!$""K"!>1"""""$@""!>1"""""$ """_#;" !"X#:$/>X#H"H@>X#H"""!r$6>!r$@:r$"!*"~9:r$"!"X#!r$4:e#!f#2a#!i#6!b#6!l#6+6!s$6>!s$ڶ*s$&$ ~ʯ*s$&$ ~‘!a#6ï*s$&$ ~¯:e#!f#2b#!a#6!s$4b~:f#W:a#:i#:c#!i#*X#"_#:j#*X#"_# *_#"X#:k#!i# RG: $!$$5Ͱ5*p#M$:j#!c#G*_#"X#:e#QO͡ "  "ͩ 2{#n Hґ*""#:"2#!i#6:{#°*"#"">'"­!"4:{#*"!"">'"!"4" f:z#!"t$"x$͡ !h6\ !"v$:{#t$v$;"H6*v$#"v$͔ :{#]>x$H"R\ : $\ͺ*v$#"t$:{#_!#&#( &#"( f#!1#6!"6:/#/!$#: $>x$H"!{#6:{#Y:{#NH':$͟O[2{#!{#6Y*x$#"x$!g#6:{#Y! $#Aͺ!z$6> !z$e*z$&%# ~2{$ ^:z$ W.ͨ*{$Mͨ!z$4/:$p>͡ !"6?" :{#ʲ:{#_!# "( :"ڬ>͔ ~>!":R#!":%#HH :#<2#!}#> *#&~# N[2p# :p# H !}$p+q.*|$ 6 !p#6 #6:q#,T:q# A!p#6N:q#$N!p#6 ͒ )$*|$ 6,*|$ 6:"<*|$w*|$ :#w!~$6>!~$ڗ*~$&$ 6!~$4|!"6#6#6!q#6*p#Mc :q#ھ:p#*Ͳ ͒ 2p#ê:p#:¿:q#(*|$#~A<*|$wO>*p#Mc %:p#[ !#5.*|$ 6 ñ:q#1!$6#6> !$ڰ!$6:$<2$O>/:$!$O!J *$&*|$ H~G:$¡.*|$ :$w[œ !#5:$2$!$49:p#[¼ _ :q#!q#6+~. 2p#Oc  :q# :p#* Ͳ ͒ !q#6+~;= 2p#Oc = :q#$ *q#&$ *|$:p#w!q#4 :p#[H !#5.*|$ 6 *|$ 6å!$q!$6> !$ڏ *$&> :$ˆ >!$4l >:q#<2q#O*|$ :p#w:p#?± !d#6!$q!p#6?!$:q# ͒ û 2p#:p# :p#]H!:p#A2$O>!:p# 9!2p#!ͥ !:p#S:p#QHX!:#<2$2p#:p# HO!1!2p#Ü!2p#02$O> r!!$6Ü!2p#02$O> ڜ!*$&!*$& !$sr!*$&$ :$w:$!>!$ҿ!ͥ -*|$ :$w 2p#_og_{ozg_og^#V))) _{ozg^#V) "^#V|g}o "_{ozgO{ozgi`N#Fogo&og= Y OVLYDIRN = Y OVLYDIRO = Y OVLYDIRP = Y OVLYDTAA = Y OVLYDTAB = Y OVLYDTAC = Y OVLYDTAD = Y OVLYDTAE = Y OVLYDTAF = Y OVLYDTAG = Y OVLYDTAH = Y OVLYDTAI = Y OVLYDTAJ = Y OVLYDTAK = Y OVLYDTAL = Y OVLYDTAM = Y OVLYDTAN = Y OVLYDTAO = Y OVLYDTAP = Y CRDATAF = N DBLALV = Y ; With extensions for the Wave Mate BULLET by dwp. ; 1-25-83, 15:04, dennis painter ; Macro Definitions for CP/M V3.0 disk tables ; dph translate$table - drive table ; disk$parameter$block ; checksum$size (optional) ; alloc$size (optional) ; skew sectors - skew table ; skew$factor ; first$sector$number ; dpb physical$sector$size - disk parameter block ; physical$sectors$per$track, ; number$tracks ; block$size ; number$dir$entries, ; track$offset, ; checksum$vec$size (optional) ; Drive Table. Contains 16 one word entries. dtbl macro ?list local ?n ?n set 0 irp ?drv, ?n set ?n+1 dw ?drv endm if ?n > 16 .' Too many drives. Max 16 allowed' exitm endif if ?n < 16 rept (16-?n) dw 0 endm endif endm dph macro ?trans,?dpb,?csize,?asize local ?csv,?alv dw ?trans ; translate table address db 0,0,0,0,0,0,0,0,0 ; BDOS scratch area db 0 ; media flag dw ?dpb ; disk parameter block if not nul ?csize dw ?csv ;9 checksum vector else dw 0fffeh ; checksum vector set by GENCPM endif if not nul ?asize dw ?alv ; allocation vector else dw 0fffeh ; alloc vector set by GENCPM endif dw 0fffeh,0fffeh ; let GENCPM setup dw 0fffeh ; dirbcb, dtabcb, hash db 0 ; hash bank is zero if not nul ?csize ?csv ds ?csize ; checksum vector endif if not nul ?asize ?alv ds ?asize ; allocation vector endif endm dpb macro ?psize,?pspt,?trks,?bls,?ndirs,?off,?ncks,?den,?side,?rps,?srat,?wptrk,?rto,?wto local ?spt,?bsh,?blm,?exm,?dsm,?drm,?al0,?al1,?cks,?psh,?psm local ?n ;; physical sector mask and physical sector shift ?psh set 0 ?n set ?psize/128 ?psm set ?n-1 rept 8 ?n set ?n/2 if ?n = 0 exitm endif ?psh set ?psh + 1 endm ?spt set ?pspt*(?psize/128) ?bsh set 3 ?n set ?bls/1024 rept 8 ?n set ?n/2 if ?n = 0 exitm endif ?bsh set ?bsh + 1 endm ?blm set ?bls/128-1 ?size set (?trks-?off)*?spt ?dsm set ?size/(?bls/128)-1  ?exm set ?bls/1024 if ?dsm > 255 if ?bls = 1024 .'Error, can''t have this size disk with 1k block size' exitm endif ?exm set ?exm/2 endif ?exm set ?exm-1 ?all set 0 ?n set (?ndirs*32+?bls-1)/?bls rept ?n ?all set (?all shr 1) or 8000h endm ?al0 set high ?all ?al1 set low ?all ?drm set ?ndirs-1 if not nul ?ncks ?cks set ?ncks else ?cks set ?ndirs/4 endif dw ?spt ; 128 byte records per track db ?bsh,?blm ; block shift and mask db ?exm ; extent mask dw ?dsm ; maximum block number dw ?drm ; max directory entry number db ?al0,?al1 ; alloc vector for directory dw ?cks ; checksum size dw ?off ; offset for system tracks db ?psh ; physical sector size db ?psm ; physical sector shift mask db ?den ; single/double DENsity db ?side ; single/double SIDEd type db ?rps ; # 128 byte Rec per Phys Sector db ?srat ; disk drive Step RATe code db ?wptrk ; write precomp track number db ?rto ; Read buffer TimeOut constant db ?wto ; Write data TimeOut constant endm ; greatest common denominator macro gcd macro ?m,?n ;; greatest common divisor of m,n ;; produces value gcdn as result ;; used in sector translate table generation ?gcdm set ?m ;; variable for m ?gcdn set ?n ;; variable for n ?gcdr set 0 ;; variable for r rept 65535 ?gcdx set ?gcdm/?gcdn ?gcdr set ?gcdm - ?gcdx*?gcdn if ?gcdr = 0 exitm endif ?gcdm set ?gcdn ?gcdn set ?gcdr endm endm skew macro ?secs,?skf,?fsc ;; generate the translate table ?nxtsec set 0 ;; next sector to fill ?nxtbas set 0 ;; moves by one on overflow gcd %?secs,?skf ;; ?gcdn = gcd(?secs,skew) ?neltst set ?secs/?gcdn ;; neltst is numbe of elements to generate ;; before we overlap previous elements ?nelts set ?neltst ;; counter rept ?secs ;; once for each sector db ?nxtsec+?fsc ?nxtsec set ?nxtsec+?skf if ?nxtsec >= ?secs ?nxtsec set ?nxtsec-?secs endif ?nelts set ?nelts-1 if ?nelts = 0 ?nxtbas set ?nxtbas+1 ?nxtsec set ?nxtbas ?nelts set ?neltst endif endm endm :"Copyright 1983 Wave Mate, Inc.1>O>ʁ͛͍!6!x! !6t!6!6!6 !!6 _ > _( w(o w(o  Ow( y  w(o !j!p<:p? >>>> 2  This utility is for BULLET revision E boards with SCSI bus interface $Controller not responding, operation aborted $Winchester drive sucessfully formatted $Z, ÑÔí òl D o t y Ð Ö 0Ä &Ù+ôù ý 6À Y i  *o͝W1͝Ͳ>Q>!2"*b2"!!*$*(**)0I(\| *$*(**)>I| h&)))~<z~Č > >w̓*"*&)z| *"*&)z | ~O #>/<033O _ W{ ! :LAO ! *N! *P2Vc 2!"< !. !,(! W!  W ! K>Q>Q>QCCP COM CRT LPT CEN 1!\(5[`(( #5!R bS` (>C:n(:n(*oq:n<2n#"onR!s"o>>(y>2n (y(:Hy .:\*br0:C( !bF(y:]ɯ :n>:H(=ɯsI1[KmxH>( y2n*qx2n"qnBc!s"q{IMsssI1[:[Gʉ2[\!\~Q(R4((6#6!b"^"`#4*`!bR S`*^w!RbS^{IMsI1[>W>>:[(>z >2[sI1[>>>0{IM~G#N#bb!91:V>Q͐Q4Y{`x/( (?4 4@@+@@_@?     ̓!}͓+6Ͳ*R7̓!}͓+6 Ͳ*R* o  o  O y ̓!sͲ!y7:y? >!+} _ > !+} _( ow(:V2:UQ:Qx:V ɯ2V SF "M CH x> >2L *W |o&> ~!B =:L ( >}ϋ>2V CW /y A!A: >2 2 (&!91 :V>Q\$y QO>  T!" {>91 :V>Qk&) ~#fo(++N^#V#S ^#VQx* ys 1 ! 5« 6! 5 ,6 !\~'`8w+~<'`8w+~<'$8 w++4 #~>&81 * 2 :V>ͱ \$/y2 " { M :1>Qʹ !^#V#{(++~2My2L+V+^ Èy2Li&) ~#fo{!~2M!~#foCNCPCR:V2Ui`#z+n&*L&)~#fo~#fo2M2Tɯ BIOS ERROR ON : T-, S-^!d|G!"""$! "*!@"&"(!Y CCP.COM too big for buffer in boot moduleCCP.COM Not found. Press RETURN to retry: CP/M Version 3.0 with BULLET SBC Banked CBIOS V06g A4!p>}!h}>>:2>x2B!;= xxx:2Gx2L!D&>O>2H!T(!_=!f=_!~#FĮď@ DE E 77 E ++nnn0n0nHnHCopyright 1983, Wave Mate Inc.:M!%< = ͑*R(!!!b!!$~x:Mw!$Twww!%62 >2 ERROR, floppy disk drive version does not match FDDRV version is: DRVTBL version is: 6!#fn^#V%>"G~O#~U~檩˿#6=sN'1'2 2 ͑!$T!~#ʤ:M2$GW y2'S :'2'G):$W y2'S(!l:'2'G:$2$:'S :' :'_:' xG!~#fo~((l#N#F#~#foq#p q#p! ~#fo~w~O#~w#~w#~w#~w#~w#~w ~!$_~w6!%4(~! = R05 !!$RutT B8 y!$wwl!( +| >>!'M#sN'1'2 2 ͑( ~ u/  o6$(G:P64ݖ0~,"! !' W$(=c" y!W$F>w#[R:UG x# ;~w>2 >2 yUsN'1'͑2 2 Q"w> ; u66$6*R:UG x# ~ w>2 >2 {N':$G!$!$T~(0Os r :Mw:Nwww'$:$G!N!$T~(~ :M ɯ2 ww~!$*$*$z(S$[$~_W"$wn f \ ͇""~w W$c"F >w#ͷ! 6͇" 5!'G6]T  N>(#  ͚  I!"~w !( !'c"!ͷ! "~w ! $W$ n" F>w#!'^6ͷ! "!'^~( y"  6ͷ! y!'66~w ~#(W$F~w#ͷ! ɯͥ!~A2!!x!ͥ! ( \   BNKBIOS3 WRITE/VERIFICATION ERROR ON : 0 !!~݆ݾ8(>6w4~ ݖw W$FOW$!'F~(>#6#x G=":',"ͷ!wO F!'!#~>>!#>!#!'>!#~NF(N V( yP(0 O90yݾ8~2$G=":'>xV(> y~ʹ#~y~ʹ#(>ʹ#Wy> ~~ F8 >C$!$#  C$"$!$ C$"$!$>=x( :$g( xʹ#>> !$=gw(>>"#S#!#= >}ϋGqxbm 9$Cgteta eLk&k ( H6#:P= _Gnf ~:$G!$~( =  wTyO>!$~ѧ##^#V~##~##~6#ð}'$(ϋ y(ϋy(ϋ[!d:Y,!zʮ+ Ү+=( ))Ҥ+ä+:P=O 0stu>O>2Y,>>>̓(2Y,!K,6Ͳ*̓!K,6Ͳ*̓!K,6 Ͳ!Q,*̓!K,6Ͳ* 2 $I$I$I$I%UUUU$@BDB  $@ $H @H@AA!@ @@A B @$"A$ @@" BH $@$$@ !@A HD B!A $   !  H DI  H*T* U@@H $!"H@ @B@B" @ DH@H @ @$ @ @@" D@H@ HH$@   I@$ @ $$ ; TITLE HDFMT.Z80 -- SCSI BUS / HARD DISK FORMATTER ; ; BASED ON SCSI BUS HARD DISK DRIVER ; edited 6-10-83, 11:29 dwp ; the data register for the sasi bus is at locations c,d,e,f. ; each input or output to the data port generates an ack pulse ; which is reset by req being deactivated. ; ; the control register for the sasi bus is the pio port a. ; it is setup as follows: ; ; a0 - atn output ; a1 - rst output (reset controller) ; a2 - sel output (select controller) ; a3 - busy input (indicates controller is in command mode) ; a4 - msg input (controller has message) ; a5 - c/d input (command is high, data is low) ; a6 - req input (request bit) ; a7 - i/o input (input is high, output is low) ; equates for sasi interface ; pioactl equ 06h ; pio port a control pioadat equ 04h ; pio port a data sasidat equ 0ch ; sasi data port datain equ sasidat ; Data in port dataout equ sasidat ; Data out port bcon equ pioadat ; Bus control bstat equ pioadat ; Bus status inout equ 7 ; In/out bit (in) req equ 6 ; Request bit (in) comdta equ 5 ; Command/data bit (in) msg equ 4 ; Message bit (in) busy equ 3 ; Busy bit (in) sel equ 2 ; Select bit (out) rst equ 1 ; Reset bit (out) atn equ 0 ; Attention bit (out) intdiag equ 0e4h ; Controller internal diag ramdiag equ 0e0h ; Controller ram diag tstrdy equ 00h ; Test drive ready intctl equ 0ch ; Initialize controller read equ 08h ; Read a sector write equ 0ah ; Write a sector wsbuf equ 0fh ; Write sector buffer stepr equ 00h ; Step rate for seek cmdbyte equ 20h or stepr ; use internal buffer for data field maxcyl equ 306 ; maximum cylinders heads equ 6 ; Four heads rwc equ -1 ; track to assert reduced write current wrpcmp equ 256 ; track to start write precomp sptrk equ 17 ; 17 sectors per track spcyl equ sptrk * heads ; Sectors per cylinder eccdbl equ 11 ; ECC data burst length bdos equ 5 false equ 0 ; False true equ not false ; True org 100h hdfmt: jp start defb false ; debug flag byte defb 'Copyright 1983 Wave Mate, Inc.' start: ld sp,stack ; ; verify that this is a rev e board ; ld a,0ffh ; make sure we are on rev e board out (18h),a ; write to disk hw control port in a,(19h) ; read hardware status port and 1 ; save bit 0 ld c,a ld a,0 out (18h),a ; see if bit 0 changes in a,(19h) and 1 sub c ; A = FF iff board is rev E ; A = 00 iff board is rev B, C or C1 ld de,msg1 ; point to error message jp z,errexit ; done if not rev E board ; ; rev e board verified ; ; initialize the controller ; call hdinit ; Initialize controller ld de,msg2 jp nz,errexit ; Error return ; ; controller initialized ; ; fill buffer with hex E5 ; then send data to controller's sector buffer ; call makefive ; fill a buffer with E5H call getcon ; get controllers attention ld hl,intcmd ld (hl),wsbuf ; write the sector buffer call sndcmd ld hl,efive ; send the data call snddta ld de,msg2 jp nz,errexit ; ; controller's sector buffer loaded ; ; issue format command ; call hdfmtrk ; format all tracks ; ; format op done ; ; ck for errors ; ld c,0 call bdos nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop hdfmtrk: hdfmt0: call getcon ; Get controllers attn. ld hl,fmtblk ; HL --> Format cmd blk call sndcmd ; Go format the disk call snddta ; Check for errors ld de,msg3 ld c,9 call bdos ret makefive: ld hl,efive ; point to efive buffer ld de,efive+1 ; destination ld bc,511 ld (hl),0e5h ; seed buffer ldir ret form ; Hdinit -- Initilize SASI interface ; ; input none ; ; output A = 0, Z = 1 if no error ; A = 1, Z = 0 if error ; hdinit: call pioinit ; Initialize PIO port A xor a,a set rst,a ; Set reset bit out (bcon),a ; Reset controller ex de,hl ; Delay a little ex de,hl xor a,a out (bcon),a ; Lift reset call getcon ; Get controllers attn ld hl,intcmd ; HL --> command block ld (<hl),intdiag ; Controller internal diag nop call sndcmd ; Send command call snddta ; Check for errors ret nz ; Error return call getcon ; Get controllers attn ld hl,intcmd ; HL --> command block ld (hl),ramdiag ; Controller ram diag nop call sndcmd ; Send command call snddta ; Check for errors ret nz ; Error return call getcon ; Get controllers attn ld hl,intcmd ; HL --> init cmd block ld (hl),intctl ; Initialize characteristics nop call sndcmd ; Send command ld hl,intdta ; HL --> init data block call snddta ; Send data ret nz ; Error return hdin1: call getcon ; Get controllers attn ld hl,intcmd ; HL --> command block ld (hl),tstrdy ; Test drive ready nop call sndcmd ; Send command call snddta ; Check for errors jr nz,hdin1 ; Loop if not ready ret ; Return if drive ready form ; Getcon -- Get controller attention ; getcon: in a,(bstat) ; Get bus status bit busy,a ; Is it busy? jr nz,getcon ; Yep -- wait 'till free ld a,1 out (dataout),a ; Indicate first device xor a,a set sel,a ; Assert sel and data0 out (bcon),a ; to get attn of controller ckbusy: in a,(bstat) ; Get bus status bit busy,a ; Check for busy jr z,ckbusy ; Not yet -- loop xor a,a out (bcon),a ; Turn off select bit ret ; and return ; Sndcmd -- Send command to controller ; ; input: hl = pointer to command block ; ; output: none ; sndcmd: ld c,dataout ; C = data out port sndc1: in a,(bstat) ; Get bus status bit req,a ; Is REQ set? jr z,sndc1 ; Nope -- wait bit comdta,a ; Command mode? ret z ; Ret when data is requested bit inout,a ; Output mode? ret nz ; Ret if it wants to send data outi ; Send a command byte jr sndc1 ; Loop back form ; Snddta -- Send data to controller ; ; input HL points to data ; ; output none ; snddta: ld c,dataout ; C = data port sndd1: in a,(bstat) ; Get bus status bit req,a ; Got request bit? jr z,sndd1 ; Nope -- wait bit comdta,a ; Check for data mode jr nz,complete ; Command mode -- done outi ; Send a byte jr sndd1 ; Back for another byte ; Complete -- Process end of SASI transaction ; complete: in a,(datain) ; Get completion status ld c,a ; Save it comp1: in a,(bstat) ; Get bus status bit req,a ; Got request bit? jr z,comp1 ; Not yet in a,(datain) ; Get last byte or a,a ; Test it for errors jr nz,badbyte ; Error -- non-zero ld a,c ; Get completion status or a,a ; Check for errors jr nz,badstat ; Got a real error xor a,a ; Indicate no errors ret ; and return form ; Getdta -- Get data from controller ; ; input HL = Data address ; ; output none ; getdta: ld c,datain ; Data input port getd1: in a,(bstat) ; Get bus status bit req,a ; Test REQ bit jr z,getd1 ; Not yet -- loop bit comdta,a ; Test for command mode jr nz,complete ; Got it -- done here ini ; Get a byte jr getd1 ; Back 'fer more ; Error handling ; badstat: badbyte: call getcon ; Get controllers attn ld hl,snsblk ; HL --> Get sense bytes call sndcmd ; Send command ld hl,snsdat ; HL --> sense bytes data call getdta ; Go get the sense bytes ld a,(snsdat) ; Get error code and a,03fh ; Isolate error cp a,018h ; Corrected ecc error? jr nz,badb1 ; Nope -- real error! xor a,a ; Clear flags ret ; and return badb1: ld a,1 ; Indicate error or a,a ; Set flags ret ; and return ; Senblk -- Get sense bytes command block snsblk: defb 03h ; Request sense bytes defb 0,0,0,0,0 ; The rest are zeros snsdat: defs 4 ; Sense byte data ; Pioinit -- Initialize PIO port A ; ; input none ; ; ouput none ; pioinit: ld a,0cfh out (pioactl),a ; set pio a mode 3 ld a,0f8h out (pioactl),a ; bits 0-2 output, 3-7 input ld a,07h out (pioactl),a ; disable pio interrupts ret ; and return errexit: ld c,9 ; DE @ error message call bdos ld c,0 ; exit call bdos form ; Cmdblk -- Command block for controller cmdblk: defb 0,0,0,0 count:  defb 1 ; Block count control: defb stepr ; Control byte ; Intcmd - Command block to initialize controller intcmd: defb 0 ; Initialize controller defb 0,0,0,0,0 ; The rest are zero ; Intdta -- Data block to initialize controller intdta: defb maxcyl/256 ; MSB of maximum cylinders defb maxcyl-(maxcyl/256)*256 ; LSB defb heads ; number of heads defb rwc/256 ; MSB of reduced write current defb rwc-(rwc/256)*256 ; LSB defb wrpcmp/256 ; MSB of write precomp track defb wrpcmp-(wrpcmp/256)*256 ; LSB defb eccdbl ; max ECC data burst length ; Fmtblk -- Format disk command block fmtblk: defb 04h ; Format disk defb 0,0,0 defb 0bh ; 11 sector interleave defb cmdbyte ; step option msg1: defb 'This utility is for BULLET revision E boards with SCSI bus interface' defb 13,10,'$' msg2: defb 'Controller not responding, operation aborted' defb 13,10,'$' msg3: defb 'Winchester drive sucessfully formatted' defb 13,10,'$' defs 100 ; stack space stack equ $ d<efs 2 efive equ $ ; buffer for 512 hex E5 bytes defs 512 end "Copyright 1983 Wave Mate, Inc.1>O>ʁ͛͍!6!x! !6t!6!6!6 !!6 _ > _( w(o w(o  Ow( y  w(o !j!p<:p? >>>> 2  This utility is for BULLET revision E boards with SCSI bus interface $Controller not responding, operation aborted $Winchester drive sucessfully formatted $ TITLE HDFMT.Z80 -- SCSI BUS / HARD DISK FORMATTER ; ; BASED ON SCSI BUS HARD DISK DRIVER ; edited 6-10-83, 11:29 dwp ; the data register for the sasi bus is at locations c,d,e,f. ; each input or output to the data port generates an ack pulse ; which is reset by req being deactivated. ; ; the control register for the sasi bus is the pio port a. ; it is setup as follows: ; ; a0 - atn output ; a1 - rst output (reset controller) ; a2 - sel output (select controller) ; a3 - busy input (indicates controller is in command mode) ; a4 - msg input (controller has message) ; a5 - c/d input (command is high, data is low) ; a6 - req input (request bit) ; a7 - i/o input (input is high, output is low) ; equates for sasi interface ; pioactl equ 06h ; pio port a control pioadat equ 04h ; pio port a data sasidat equ 0ch ; sasi data port datain equ sasidat ; Data in port dataout equ sasidat ; Data out port bcon equ pioadat ; Bus control bstat equ pioadat ; Bus status inout equ 7 ; In/out bit (in) req equ 6 ; Request bit (in) comdta equ 5 ; Command/data bit (in) msg equ 4 ; Message bit (in) busy equ 3 ; Busy bit (in) sel equ 2 ; Select bit (out) rst equ 1 ; Reset bit (out) atn equ 0 ; Attention bit (out) intdiag equ 0e4h ; Controller internal diag ramdiag equ 0e0h ; Controller ram diag tstrdy equ 00h ; Test drive ready intctl equ 0ch ; Initialize controller read equ 08h ; Read a sector write equ 0ah ; Write a sector wsbuf equ 0fh ; Write sector buffer stepr equ 00h ; Step rate for seek cmdbyte equ 20h or stepr ; use internal buffer for data field maxcyl equ 306 ; maximum cylinders heads equ 4 ; Four heads rwc equ -1 ; track to assert reduced write current wrpcmp equ 256 ; track to start write precomp sptrk equ 17 ; 17 sectors per track spcyl equ sptrk * heads ; Sectors per cylinder eccdbl equ 11 ; ECC data burst length bdos equ 5 false equ 0 ; False true equ not false ; True org 100h hdfmt: jp start defb false ; deb=ug flag byte defb 'Copyright 1983 Wave Mate, Inc.' start: ld sp,stack ; ; verify that this is a rev e board ; ld a,0ffh ; make sure we are on rev e board out (18h),a ; write to disk hw control port in a,(19h) ; read hardware status port and 1 ; save bit 0 ld c,a ld a,0 out (18h),a ; see if bit 0 changes in a,(19h) and 1 sub c ; A = FF iff board is rev E ; A = 00 iff board is rev B, C or C1 ld de,msg1 ; point to error message jp z,errexit ; done if not rev E board ; ; rev e board verified ; ; initialize the controller ; call hdinit ; Initialize controller ld de,msg2 jp nz,errexit ; Error return ; ; controller initialized ; ; fill buffer with hex E5 ; then send data to controller's sector buffer ; call makefive ; fill a buffer with E5H call getcon ; get controllers attention ld hl,intcmd ld (hl),wsbuf ; write the sector buffer call sndcmd ld hl,efive ; send the data call snddta ld de,msg2 jp nz,errexit ; ; controller's sector buffer loaded ; ; issue format command ; call hdfmtrk ; format all tracks ; ; format op done ; ; ck for errors ; ld c,0 call bdos nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop hdfmtrk: hdfmt0: call getcon ; Get controllers attn. ld hl,fmtblk ; HL --> Format cmd blk call sndcmd ; Go format the disk call snddta ; Check for errors ld de,msg3 ld c,9 call bdos ret makefive: ld hl,efive ; point to efive buffer ld de,efive+1 ; destination ld bc,511 ld (hl),0e5h ; seed buffer ldir ret form ; Hdinit -- Initilize SASI interface ; ; input none ; ; output A = 0, Z = 1 if no error ; A = 1, Z = 0 if error ; hdinit: call pioinit ; Initialize PIO port A xor a,a set rst,a ; Set reset bit out (bcon),a ; Reset controller ex de,hl ; Delay a little ex de,hl xor a,a out (bcon),a ; Lift reset call getcon ; Get controllers attn ld hl,intcmd ; HL --> command block ld (hl),intdiag ; Controller internal diag nop call sndcmd ; Send command call snddta ; Check for errors ret nz ; Error return call getcon ; Get controllers attn ld hl,intcmd ; HL --> command block ld (hl),ramdiag ; Controller ram diag nop call sndcmd ; Send command call snddta ; Check for errors ret nz ; Error return call getcon ; Get controllers attn ld hl,intcmd ; HL --> init cmd block ld (hl),intctl ; Initialize characteristics nop call sndcmd ; Send command ld hl,intdta ; HL --> init data block call snddta ; Send data ret nz ; Error return hdin1: call getcon ; Get controllers attn ld hl,intcmd ; HL --> command block ld (hl),tstrdy ; Test drive ready nop call sndcmd ; Send command call snddta ; Check for errors jr nz,hdin1 ; Loop if not ready ret ; Return if drive ready form ; Getcon -- Get controller attention ; getcon: in a,(bstat) ; Get bus status bit busy,a ; Is it busy? jr nz,getcon ; Yep -- wait 'till free ld a,1 out (dataout),a ; Indicate first device xor a,a set sel,a ; Assert sel and data0 out (bcon),a ; to get attn of controller ckbusy: in a,(bstat) ; Get bus status bit busy,a ; Check for busy jr z,ckbusy ; Not yet -- loop xor a,a out (bcon),a ; Turn off select bit ret ; and return ; Sndcmd -- Send command to controller ; ; input: hl = pointer to command block ; ; output: none ; sndcmd: ld c,dataout ; C = data out port sndc1: in a,(bstat) ; Get bus status bit req,a ; Is REQ set? jr z,sndc1 ; Nope -- wait bit comdta,a ; Command mode? ret z ; Ret when data is requested bit inout,a ; Output mode? ret nz ; Ret if it wants to send data outi ; Send a command byte jr sndc1 ; Loop back form ; Snddta -- Send data to controller ; ; input HL points to data ; ; output none ; snddta: ld c,dataout ; C = data port sndd1: in a,(bstat) ; Get bus status bit req,a ; Got request bit? jr z,sndd1 ; Nope -- wait bit comdta,a ; Check for data mode jr nz,complete ; Command mode -- done outi ; Send a byte jr sndd1 ; Back for another byte ; Complete -- Process end of SASI transaction ; complete: in a,(datain) ; Get completion status ld c,a ; Save it comp1: in a,(bstat) ; Get bus status bit req,a ; Got request bit? jr z,comp1 ; Not yet in a,(datain) ; Get last byte or a,a ; Test it for errors jr nz,badbyte ; Error -- non-zero ld a,c ; Get completion status or a,a ; Check for errors jr nz,badstat ; Got a real error xor a,a ; Indicate no errors ret ; and return form ; Getdta -- Get data from controller ; ; input HL = Data address ; ; output none ; getdta: ld c,datain ; Data input port getd1: in a,(bstat) ; Get bus status bit req,a ; Test REQ bit jr z,getd1 ; Not yet -- loop bit comdta,a ; Test for command mode jr nz,complete ; Got it -- done here ini ; Get a byte jr getd1 ; Back 'fer more ; Error handling ; badstat: badbyte: call getcon ; Get controllers attn= ld hl,snsblk ; HL --> Get sense bytes call sndcmd ; Send command ld hl,snsdat ; HL --> sense bytes data call getdta ; Go get the sense bytes ld a,(snsdat) ; Get error code and a,03fh ; Isolate error cp a,018h ; Corrected ecc error? jr nz,badb1 ; Nope -- real error! xor a,a ; Clear flags ret ; and return badb1: ld a,1 ; Indicate error or a,a ; Set flags ret ; and return ; Senblk -- Get sense bytes command block snsblk: defb 03h ; Request sense bytes defb 0,0,0,0,0 ; The rest are zeros snsdat: defs 4 ; Sense byte data ; Pioinit -- Initialize PIO port A ; ; input none ; ; ouput none ; pioinit: ld a,0cfh out (pioactl),a ; set pio a mode 3 ld a,0f8h out (pioactl),a ; bits 0-2 output, 3-7 input ld a,07h out (pioactl),a ; disable pio interrupts ret ; and return errexit: ld c,9 ; DE @ error message call bdos ld c,0 ; exit call bdos form ; Cmdblk -- Command block for controller cmdblk: defb 0,0,0,0 count:  defb 1 ; Block count control: defb stepr ; Control byte ; Intcmd - Command block to initialize controller intcmd: defb 0 ; Initialize controller defb 0,0,0,0,0 ; The rest are zero ; Intdta -- Data block to initialize controller intdta: defb maxcyl/256 ; MSB of maximum cylinders defb maxcyl-(maxcyl/256)*256 ; LSB defb heads ; number of heads defb rwc/256 ; MSB of reduced write current defb rwc-(rwc/256)*256 ; LSB defb wrpcmp/256 ; MSB of write precomp track defb wrpcmp-(wrpcmp/256)*256 ; LSB defb eccdbl ; max ECC data burst length ; Fmtblk -- Format disk command block fmtblk: defb 04h ; Format disk defb 0,0,0 defb 0bh ; 11 sector interleave defb cmdbyte ; step option msg1: defb 'This utility is for BULLET revision E boards with SCSI bus interface' defb 13,10,'$' msg2: defb 'Controller not responding, operation aborted' defb 13,10,'$' msg3: defb 'Winchester drive sucessfully formatted' defb 13,10,'$' defs 100 ; stack space stack equ $ defs 2 efive equ $ ; buffer for 512 hex E5 bytes defs 512 end g: date set >g: date set >??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOO