IMD 1.18: 9/11/2012 10:02:28 install 2 8-20 new 86 bios at 680  *!>G :22!!:_ o(!!8>G^!:!q@'@>y>ycwcwF } (КϫҐ>8M PCOM$$$  SUBDIR LISTmTYPEqUSERDFU GO ERA GSAVEREN GET JUMP21wy_[2-y2o(#2-z>/=/2-:۷ )1wͭAʹYݷ( 8 >1ʹ0ʹ}2o:޷u~#fo: !޶No Fil> ʹ> _t(>(ʹ ͭ~ʹ~#  _2<!-~6z>_ Y݇!oݶ2>2a{_>>:-ܷ(Ez/(;:=2 /!P!6#5z6(>>ʹ!E=E_ n!F#~tw6!"Y Qͭ*[~(ʹ#ݿE= 8=_.:;<>[Y o$! ~+ H(+!~ (#0 0Wy8 88Oy! ~ (-H()08 80#OzW{_W{_}!L~ɯ2:o#>=!oݾ!ۯ2?S[( @G:(:owx2p2F. Fg#6SY:۷"(#* 6?mw?m"#6 :<2!  # ### !~ ??(SYS > D 2>2W:̢(g=`O> բ J{ ͭ x  >  (> ʹx 0 >.ʹ A 6?# AllY=ͭP>2?2("Y(ͭ>2!6!~8 8w4!L~  8 ( > x (=Æ!5 6>P(ʎQo&X1(:2?S()SY|(+! 6< :Delete FileYŽPX:!?= (#"Y G!~(p p21͢Æ_[Ñ2͏( 2_[!ޯ‚6!>ڼ8 =Ful>!HIDOS11hs$1V!""S{2!Ry)K!V_^#V*:(*6:( w:2{$*}D:5y<( < ) m :!q$O͋2>>"ö!""2!"~?(~?ĝ*"? <('(U1s͉6ʹͿ?< Qà *Fp<(s ͪ?à*B:öS(U*(*#͔ <(  ͪ?:Ͷ*": :ö2F̄ *!r#r#r<( ͉͏_y#x#{8s+p+q?*}/_|/*W}_*"}o|g">2̄Bdos Err On : $Bad Sector$Select$File R/O$ Not Locked$No Locks$ SHRALLOC$ͦ!W!~!v?!6$ ͦͦ!r!b!n!i?:A2SGͦͦ!#~6  O͋  :#   2#> F :  :"y!!4 5~y 5 6y 0 ^F@Oy  F:! ͥ  #F?:!!  F:!2 *N# ʍ ʍ x(:!2M x(~+v      ?2  !">w : !!05͝ ͪ 3ͪx( #N{:!!2͝!5 #wO{~x p F! bk6+!! "J6 !"`}*+"| !"**f}*LL error at v!XFINT error at v!X̀M+++̀!:: !~~&o ^#V ?_ 4   4       |*"*"*|!k(J|ͮ!*:!ͮ!f::#:#*":2?2}FyE*+"*"|M!k !}F!"$!k !!"yE!"!">2 ÁÌ×âÿù0ÑÖÛýå++++++++++,J S à2m O ++++++++r!( # 4~?(#< :<(͘:<(  öͺã>2>2 :!8 2: ( @#$ú>22́*v :Һj͗(U;(j͍2(O ͪDMPYy( 0*{z0BK0O: ('* :(n& ^#V͍Oͪ"}:*)= ":O:o"x2* 1>G^"":222O2M:2N:2H!@6#>2G!1:(!+ !2!" !# >+>@+>#># :(>22!:>( >3>3>3>3>P0>Z > > >*>*>+>+!X! M CP/M 2.250r L{2z2x2:2!L6 :NG 6X22:2͟!:w+!"X!8>2!:( >822͆:!L:o(5Xg( 5KG(5A:o(54W(5*(5 G(5g(5 O(!M43>822A=1>G^>2!"20"12!"J0͹͖͛ ͖͑͛͠ ͠͠:O!Nv˶?M_:_{ :_:M:_~#fovvvvvvvvvvvvvvvvy !} >öQ"* ::(͏sO s#r:@((͔w$>222::== :y== 3*Ww#*"@(*:G# "@(:!8w4 ͔w : $!~ =26$2[*!~2~2:2: O:w:w:O <:!<=()yoxg*;}!N#FH"͉ ~*\* *:o$*~͔6͔w* ͉1(KK$*[!~#2~,0~#!,w#F0G˨:80 ;8e0ˠ:+Ox 2+G:3 yx23S+~@QQ>>2+J /23(Xϫvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvs1!@:H4 6#><4 w#><4 ws1&(1͗{M(O*}&q<2*|<G>?(h&~!p*(y(+>i()+(y)">ͅ( "(y #>͡(!#(y!@@(  y:(w y yS!!~W~#~O~G#~G~. ^z[! w! y !x(6.:<(*! q!p;:< . (͘.:<(ö͔6}2ãN! ~态O>G~G!~G~0* ͏!!q#p#w:!w*:O?O| * ^#V###"##"##S8:21#y<_WyOxOxG* ~  w>2*[MD*":2:G[!N40MD!K$: #(*"͉ :(N N#Fy(*BC#>22!q*" :TEE >2r#>4 w##4: !+~(5 ͌#{M(! to abort, to retry, or to ignore +~q ʝ y2S +~x y( 82!2S+~!Y( ( :!p#q2!y Cy2CCS+~(`i# n&!"S+~( (:2!Xw+4CQK Cx*#*|!6(6*;}KH"(< >!>!>*! " "! 6 <(2* *?#DM*6# x [*s#r͉>(: #~$ =2ʹ:w>2*~=20:2~2w:*w(*#~O#y "&''[o|g""R(:(k*[R 2([͉:Oy(/?($x ( ( N:/GyO # :2!~:w>ö͝<~͉[ ͣ! N!Fwyx(>8>*w~# FDC buf: Cmd Dsk Trk Hd Sec Den Max Gap Len StatuseNRDYDATATRACENDT ID ORUNSECTPROTDENSMADRI/O !X!6 ~#~# (####:NG >2L2R}vb!XR(!X!X!j!L6 !X͌(  CA !:G(OX xHH(,xo( y(QÆ:NG ͆> x ͆"o>23*o#}y*"*+"2*":2:(:ʐ[*R :G: [!|ͮ:!8![:(:ʗ:0J Copyright (c) 1983 Digital Microsystems vvvvvvvvw| >|?ejpwf6+w#w+222\͔:<ė<(Z͉ * :(~ w ~ 8 *# $ #  8 w ~>2ͼ!6́͗͝:@{*#!""<(!w# ! w ͪͣ2:<* ~<w( G:     SYSLIB1 OVREpqrstSYSLIB1 OVREcdefg),3(dst(0)) endm codemacro FSTP dst:Mb segfix dst db 0d9h modrm 3,dst endm codemacro FSTP dst:Mw segfix dst db 0ddh modrm 3,dst endm codemacro FSTP ; PIP2.SUB VERSION 1.0 10 APR, 1985 ; ; THIS SUBMIT PROGRAM PIPS THE APPROPRIATE FILES FROM ; THE INSTALL 2 DISKETTE TO THE PARTITION OF YOUR CHOICE. ; YOU MUST SPECIFY THE DESTINATION AND SOURCE DRIVES. ; PIP $1:=$2:CUST*.CMD[V] PIP $1:=$2:LOGIN.CLMCMD COMabLMCMD CMD(LOGIN CMDdLMCMD COMVW8087 LIB[SB8-70 D2 8087 LIB[SYSLIB2 OVRvwWHICH C86 WHICH MS  WHICH DBGLDCPM A86,345CUSTOM2 CMDwxyz{|}~CUSTOM2 CMDCUSTOM2 CMDCUSTOM2 CMDCUSTOM2 CMD8LDCPM A86,)*+CUSTOM2 CMDrstuv dst:Db(0,7) db 0ddh dbit 5(1bh),3(dst(0)) endm codemacro FSTPTR dst:M segfix dst db 0dbh modrm 7,dst endm codemacro FXCH dw 0c9d9h endm codemacro FXCMD[V] PIP $1:LOGOUT.CMD=$2:LOGIN.CMD[V] ; THATS ALL FOLKS u 3 ; register 3 st4 equ 4 ; register 4 st5 equ 5 ; register 5 st6 equ 6 RANDOM A8686789INSTALL COM\[\]^_`RANDOM A868,-./LDCOPY A86Z-./012GENDEF COMLVWXYZSYSLIB7 OVRuvCUSTOMIZCMDCBIOS A86RCMAP816 11 ICBIOS A86R COPYDISKA86 !COPYDISKA86 "MSTEST LCOPYDISKA86CUSTOM2 CMDCUSTOM2 CMDCUSTOM2 CMD8CMAPHNS 11 JSYSLIB COMcdefghijSYSLIB COMAklmnoCMAPHNS 11 ?H dst:Db(0,7) db 0d9h dbit 5(19h),3(dst(0)) endm codemacro FILD src:Mb segfix src db 0dbh modrm 0,src endm codemacro FILDLI src:Mw segfix src db ; register 6 st7 equ 7 ; register 7 ; ; codemacro FLD src:Mb segfix src db 0d9h modrm 0,src endm codemacro FLD src:Mw segfix src db 0ddh modrm 0LDBIOS A86#$%&'()*LDBIOS A86+,CUSTOMIZCMD)GENDEF CMDLTBIOS A86:;<=>?@ATBIOS A860BCD$$$ SUBKLDBIOS A86!"SINGLES DEF SINGLES DEFTRACK A868EFGHTRACK A868:;<=PIP2 SUBPIP2 SUBDISKCHK COM UDISKCHK COM Jnolist ; ***************************** ; * Codemacros for 8087 * ; * numeric data processor: * ; *************************** ; ; stack references: st equ 0 ; stack top (= register ,src endm codemacro FLD src:Db(0,7) db 0d9h dbit 5(18h),3(src(0)) endm codemacro FLDTR src:M segfix src db 0dbh modrm 5,src endm codemacro FST dst:Mb TBIOS A8601234567TBIOS A86089BIOS A86 BIOS A86BIOS A86 BIOS A86TWITCH OS MPSTRUCTDEFPSWD H #WHO H $SYSLIB3 OVR)stu0) st0 equ 0 ; register 0 st1 equ 1 ; register 1 st2 equ 2 ; register 2 st3 equ 3 ; register 3 st4 equ 4 ; register 4 st5 equ 5 ; register 5 st6 equ 6  segfix dst db 0d9h modrm 2,dst endm codemacro FST dst:Mw segfix dst db 0ddh modrm 2,dst endm codemacro FST dst:Db(0,7) db 0ddh dbit 5(1ahCPM86 KCPM86 13G{MNOPQRSTCPM86 DPB/DPH DAT!MPCONST DEFCPMCONSTDEFSYSLIB4 OVRx     ; register 6 st7 equ 7 ; register 7 ; ; codemacro FLD src:Mb segfix src db 0d9h modrm 0,src endm codemacro FLD src:Mw segfix src db 0ddh modrm 0,7),src:Db(0) db 0deh dbit 5(19h),3(dst(0)) endm codemacro FIMUL src:Mb segfix src db 0dah modrm 1,src endm codemacro FIMUL src:Mw segfix src db 0d codemacro FSUBR dst:Db(0),src:Db(0,7) db 0d8h dbit 5(1dh),3(src(0)) endm codemacro FSUBR src:Mb segfix src db 0d8h modrm 5,src endm codemacro FSUBR src:Mw ADD dst:Db(0,7),src:Db(0) db 0dch dbit 5(18h),3(dst(0)) endm codemacro FADDP dst:Db(0,7),src:Db(0) db 0deh dbit 5(18h),3(dst(0)) endm codemacro FIADD src:Mb segfix src 0dfh modrm 5,src endm codemacro FILD src:Mw segfix src db 0dfh modrm 0,src endm codemacro FIST dst:Mb segfix dst db 0dbh modrm 2,dst endm codema,src endm codemacro FLD src:Db(0,7) db 0d9h dbit 5(18h),3(src(0)) endm codemacro FLDTR src:M segfix src db 0dbh modrm 5,src endm codemacro FST dst:Mb eh modrm 1,src endm codemacro FDIV dw 0f1d8h endm codemacro FDIV dst:Db(0),src:Db(0,7) db 0d8h dbit 5(1eh),3(src(0)) endm codemacro FDIV src:Mb segfix src  segfix src db 0dch modrm 5,src endm codemacro FSUBR dst:Db(0,7),src:Db(0) db 0dch dbit 5(1dh),3(dst(0)) endm codemacro FSUBRP dst:Db(0,7),src:Db(0) db 0deh  db 0dah modrm 0,src endm codemacro FIADD src:Mw segfix src db 0deh modrm 0,src endm codemacro FSUB dw 0e1d8h endm codemacro FSUB dst:Db(0),src:Db(cro FIST dst:Mw segfix dst db 0dfh modrm 2,dst endm codemacro FISTP dst:Mb segfix dst db 0dbh modrm 3,dst endm codemacro FISTPLI dst:Mw segfix ds segfix dst db 0d9h modrm 2,dst endm codemacro FST dst:Mw segfix dst db 0ddh modrm 2,dst endm codemacro FST dst:Db(0,7) db 0ddh dbit 5(1ah db 0d8h modrm 6,src endm codemacro FDIV src:Mw segfix src db 0dch modrm 6,src endm codemacro FDIV dst:Db(0,7),src:Db(0) db 0dch dbit 5(1eh),3(dst(0) dbit 5(1dh),3(dst(0)) endm codemacro FISUBR src:Mb segfix src db 0dah modrm 5,src endm codemacro FISUBR src:Mw segfix src db 0deh modrm 5,src endm codemacr0,7) db 0d8h dbit 5(1ch),3(src(0)) endm codemacro FSUB src:Mb segfix src db 0d8h modrm 4,src endm codemacro FSUB src:Mw segfix src db 0dch t db 0dfh modrm 7,dst endm codemacro FISTP dst:Mw segfix dst db 0dfh modrm 3,dst endm codemacro FBLD src:Mb segfix src db 0dfh modrm 4,s),3(dst(0)) endm codemacro FSTP dst:Mb segfix dst db 0d9h modrm 3,dst endm codemacro FSTP dst:Mw segfix dst db 0ddh modrm 3,dst endm codemacro FSTP ) endm codemacro FDIVP dst:Db(0,7),src:Db(0) db 0deh dbit 5(1eh),3(dst(0)) endm codemacro FIDIV src:Mb segfix src db 0dah modrm 6,src endm codemacro FIDIV src:o FMUL dw 0c9d8h endm codemacro FMUL dst:Db(0),src:Db(0,7) db 0d8h dbit 5(19h),3(src(0)) endm codemacro FMUL src:Mb segfix src db 0d8h modrm 1,src e modrm 4,src endm codemacro FSUB dst:Db(0,7),src:Db(0) db 0dch dbit 5(1ch),3(dst(0)) endm codemacro FSUBP dst:Db(0,7),src:Db(0) db 0deh dbit 5(1ch),3(dst(0)) endm codemacrrc endm codemacro FBSTP dst:Mb segfix dst db 0dfh modrm 6,dst endm codemacro FADD dw 0c1d8h endm codemacro FADD dst:Db(0),src:Db(0,7) db 0d8h dbit  dst:Db(0,7) db 0ddh dbit 5(1bh),3(dst(0)) endm codemacro FSTPTR dst:M segfix dst db 0dbh modrm 7,dst endm codemacro FXCH dw 0c9d9h endm codemacro FXCMw segfix src db 0deh modrm 6,src endm codemacro FDIVR dw 0f9d8h endm codemacro FDIVR dst:Db(0),src:Db(0,7) db 0d8h dbit 5(1fh),3(src(0)) endm codemacro ndm codemacro FMUL src:Mw segfix src db 0dch modrm 1,src endm codemacro FMUL dst:Db(0,7),src:Db(0) db 0dch dbit 5(19h),3(dst(0)) endm codemacro FMULP dst:Db(0o FISUB src:Mb segfix src db 0dah modrm 4,src endm codemacro FISUB src:Mw segfix src db 0deh modrm 4,src endm codemacro FSUBR dw 0e9d8h endm  5(18h),3(src(0)) endm codemacro FADD src:Mb segfix src db 0d8h modrm 0,src endm codemacro FADD src:Mw segfix src db 0dch modrm 0,src endm codemacro FH dst:Db(0,7) db 0d9h dbit 5(19h),3(dst(0)) endm codemacro FILD src:Mb segfix src db 0dbh modrm 0,src endm codemacro FILDLI src:Mw segfix src db       FDIVR src:Mb segfix src db 0d8h modrm 7,src endm codemacro FDIVR src:Mw segfix src db 0dch modrm 7,src endm codemacro FDIVR dst:Db(0,7),src:Db(0) d****************************************** SELDSK: ;select disk given by register CL mov bx,0000h cmp cl,2 ;this BIOS only supports 2 disks jnb return ;return w/ 0000 in BX if bad drive mov al, 80h cmp cl,0 jne sel1 ;drive 1 if not zero  segfix src db 0d9h modrm 4,src endm codemacro FINCSTP dw 0f7d9h endm codemacro FDECSTP dw 0f6d9h endm codemacro FFREE dst:Db(0,7) db 0ddh db dw 0e9d9h endm codemacro FLDL2E dw 0ead9h endm codemacro FLDLG2 dw 0ecd9h endm codemacro FLDLN2 dw 0edd9h endm codemacro FINIT dw 0e3dbh endm FNINI endm codemacro FCOMP src:Mb segfix src db 0d8h modrm 3,src endm codemacro FCOMP src:Mw segfix src db 0dch modrm 3,src endm codemacro FCOMPP db 0dch dbit 5(1fh),3(dst(0)) endm codemacro FDIVRP dst:Db(0,7),src:Db(0) db 0deh dbit 5(1fh),3(dst(0)) endm codemacro FIDIVR src:Mb segfix src db 0dah modrm mov al, 40h ;else drive is 0 sel1: mov sel_mask,al ;save drive select mask ;now, we need disk parameter address mov ch,0 mov bx,cx ;BX = word(CL) mov cl,4 shl bx,cl ;multiply drive code * 16 ;create offset from Disk Parameter Base add bx,oit 5(18h),3(dst(0)) endm codemacro FNOP dw 0d0ddh endm FWAIT equ WAIT list ret ;IOBYTE not implemented SETIOBF: ret ;iobyte not implemented zero_ret: and al,0 ret ;return zero in AL and flT equ FINIT codemacro FDISI dw 0e1dbh endm FNDISI equ FDISI codemacro FENI dw 0e0dbh endm FNENI equ FENI codemacro FLDCW src:Mw segfix src db 0d9h w 0c9deh endm codemacro FICOM src:Mb segfix src db 0dah modrm 2,src endm codemacro FICOM src:Mw segfix src db 0deh modrm 2,src endm codemacro FICOM 7,src endm codemacro FIDIVR src:Mw segfix src db 0deh modrm 7,src endm codemacro FSQRT dw 0fad9h endm codemacro FSCALE dw 0fdd9h endm codemacro FPREM ffset dp_base return: ret HOME: ;move selected disk to home position (Track 0) mov trk,0 ;set disk i/o to track zero mov bx,offset hom_com call execute jz return ;home drive and return if OK mov bx,offset bad_hom ;else print call pmsg ;"ags ; Routine to get and echo a console character ; and shift it to upper case uconecho: call CONIN ;get a console character push ax mov cl,al ;save and call CONOUT pop ax ;echo to console cmp al,'a' jb uret ;less than 'a' is ok cm modrm 5,src endm codemacro FSTCW dst:Mw segfix dst db 0d9h modrm 7,dst endm FNSTCW equ FSTCW codemacro FSTSW dst:Mw segfix dst db 0ddh modrm 7,dst P src:Mb segfix src db 0dah modrm 3,src endm codemacro FICOMP src:Mw segfix src db 0deh modrm 3,src endm codemacro FTST dw 0e4d9h endm codemacro  dw 0f8d9h endm codemacro FRNDINT dw 0fcd9h endm codemacro FXTRACT dw 0f4d9h endm codemacro FABS dw 0e1d9h endm codemacro FCHS dw 0e0d9h endm coHome Error" jmps home ;and retry SETTRK: ;set track address given by CX mov trk,cl ;we only use 8 bits of track address ret SETSEC: ;set sector number given by cx mov sect,cl ;we only use 8 bits of sector address ret SECTRAN: ;translate p al,'z' ja uret ;greater than 'z' is ok sub al,'a'-'A' ;else shift to caps uret: ret ; utility subroutine to print messages pmsg: mov al,[BX] ;get next char from message test al,al jz return ;if zero return mov CL,AL call CONOUT  endm FNSTSW equ FSTSW codemacro FCLEX dw 0e2dbh endm FNCLEX equ FCLEX codemacro FSAVE dst:M segfix dst db 0ddh modrm 6,dst endm FNSAVE equ FSAVE codemacro  FXAM dw 0e5d9h endm codemacro FPTAN dw 0f2d9h endm codemacro FPATAN dw 0f3d9h endm codemacro F2XM1 dw 0f0d9h endm codemacro FYL2X dw 0f1d9h demacro FCOM dw 0d1d8h endm codemacro FCOM src:Db(0,7) db 0d8h dbit 5(1ah),3(src(0)) endm codemacro FCOM src:Mb segfix src db 0d8h modrm 2,src endm sector CX using table at [DX] mov bx,cx add bx,dx ;add sector to tran table address mov bl,[bx] ;get logical sector ret SETDMA: ;set DMA offset given by CX mov dma_adr,CX ret SETDMAB: ;set DMA segment given by CX mov dma_seg,CX ret ; disks 2 diskdef 0,1,26,6,1024,243,64,64,2 diskdef 1,0 endef  * ;* Disk Input/Output Routines * ;* * ;*** FRSTOR src:M segfix src db 0ddh modrm 4,src endm codemacro FSTENV dst:M segfix dst db 0d9h modrm 6,dst endm FNSTENV equ FSTENV codemacro FLDENV src:M endm codemacro FYL2XP1 dw 0f9d9h endm codemacro FLDZ dw 0eed9h endm codemacro FLD1 dw 0e8d9h endm codemacro FLDPI dw 0ebd9h endm codemacro FLDL2T  codemacro FCOM src:Mw segfix src db 0dch modrm 2,src endm codemacro FCOMP dw 0d9d8h endm codemacro FCOMP src:Db(0,7) db 0d8h dbit 5(1bh),3(src(0))       GETSEGT: ;return address of physical memory table mov bx,offset seg_table ret ;********************************************* ;* * ;* All disk I/O parameters are setup: the * ;* Read and Write entrymap byte (IOBYTE) ;********************************************* ;* * ;* INIT Entry Point, Differs for LDBIOS and * ;* BIOS, according to "Loader_Bios" value * ;* n disk i/o ;before perm error cr equ 0dh ;carriage return lf equ 0ah ;line feed cseg org ccpoffset ccp: org bios_code ;********************************************* ;* * ;* BIOS Jump Vecto ;| | lsts equ 41h ;2651 No. 0 on BLC8538 status port ldata equ 40h ; " " " " " data port blc_reset equ 60h ;reset selected USARTS on BLC8538 ;| | ;-----* Loader_bios is true if assembling the * ;* LOADER BIOS, otherwise BIOS is for the * ;* CPM.SYS file. Blc_list is true if we * ;* have a serial printer attached to BLC8538 * ;* Bdos_int is interrupt used for earlier * ;* versions.  points transfer one * ;* sector of 128 bytes to/from the current * ;* DMA address using the current disk drive * ;* * ;********************************************* READ: mov al,12h ;basic read sector * ;********************************************* INIT: ;print signon message and initialize hardware mov ax,cs ;we entered with a JMPF so use mov ss,ax ; CS: as the initial value of SS:, mov ds,ax ; DS:, mov es,ax ; and ES: ;use local stacr for Individual Routines * ;* * ;********************************************* jmp INIT ;Enter from BOOT ROM or LOADER jmp WBOOT ;Arrive here from BDOS call 0 jmp CONST ;return console keyboard status---------------------------------------- ENDIF ;blc_list ;********************************************* ;* * ;* Intel iSBC 204 Disk Controller Ports * ;* * ;* * ;* * ;********************************************* loader_bios equ false blc_list equ true bdos_int equ 224 ;reserved BDOS Interrupt IF not loader_bios ;------------------ title '8086 Disk I/O Drivers' ;********************************************* ;* * ;* Basic Input/Output System (BIOS) for * ;* CP/M-86 Configured for iSBC 86/12 with * ;* the iSBC 204 Floppy Disk Cok during initialization mov sp,offset stkbase cld ;set forward direction IF not loader_bios ;--------------------------------------------- ;| | ; This is a BIOS for the CPM.SYS file. ; Setup all inte jmp CONIN ;return console keyboard char jmp CONOUT ;write char to console device jmp LISTOUT ;write character to list device jmp PUNCH ;write character to punch device jmp READER ;return char from reader device jmp HOME ;move to trk 00 on******************************************** base204 equ 0a0h ;SBC204 assigned address fdc_com equ base204+0 ;8271 FDC out command fdc_stat equ base204+0 ;8271 in status fdc_parm equ base204+1 ;8271 out parameter fdc_rslt equ base204+1 ;8271 in --------------------------- ;| | bios_code equ 2500h ccp_offset equ 0000h bdos_ofst equ 0B06h ;BDOS entry point ;| | ;--------------------------------------------- ntroller * ;* * ;* (Note: this file contains both embedded * ;* tabs and blanks to minimize the list file * ;* width for printing purposes. You may wish* ;* to expand the blanks before performing *rrupt vectors in low ; memory to address trap push ds ;save the DS register mov ax,0 mov ds,ax mov es,ax ;set ES and DS to zero ;setup interrupt 0 to address trap routine mov int0_offset,offset int_trap mov int0_segment,CS mov di,4  cur sel drive jmp SELDSK ;select disk for next rd/write jmp SETTRK ;set track for next rd/write jmp SETSEC ;set sector for next rd/write jmp SETDMA ;set offset for user buff (DMA) jmp READ ;read a 128 byte sector jmp WRITE ;write a 128result fdc_rst equ base204+2 ;8271 out reset dmac_adr equ base204+4 ;8257 DMA base address out dmac_cont equ base204+5 ;8257 out control dmac_scan equ base204+6 ;8257 out scan control dmac_sadr equ base204+7 ;8257 out scan address dmac_mode equ baseENDIF ;not loader_bios IF loader_bios ;--------------------------------------------- ;| | bios_code equ 1200h ;start of LDBIOS ccp_offset equ 0003h ;base of CPMLOADER bdos_ofst equ 0406h ;stripped BDOS ent ;* major editing.) * ;********************************************* ; Copyright (C) 1980,1981 ; Digital Research, Inc. ; Box 579, Pacific Grove ; California, 93950 ; ; (Permission is hereby granted to use ; or abstractmov si,0 ;then propagate mov cx,510 ;trap vector to rep movs ax,ax ;all 256 interrupts ;BDOS offset to proper interrupt mov bdos_offset,bdos_ofst pop ds ;restore the DS register ;********************************************* ;*  byte sector jmp LISTST ;return list status jmp SECTRAN ;xlate logical->physical sector jmp SETDMAB ;set seg base for buff (DMA) jmp GETSEGT ;return offset of Mem Desc Table jmp GETIOBF ;return I/O map byte (IOBYTE) jmp SETIOBF ;set I/O 204+8 ;8257 out mode dmac_stat equ base204+8 ;8257 in status fdc_sel equ base204+9 ;FDC select port (not used) fdc_segment equ base204+10 ;segment address register reset_204 equ base204+15 ;reset entire interface max_retries equ 10 ;max retries ory ;| | ;--------------------------------------------- ENDIF ;loader_bios csts equ 0DAh ;i8251 status port cdata equ 0D8h ; " data port IF blc_list ;--------------------------------------------- the following program in ; the implementation of CP/M, MP/M or ; CP/NET for the 8086 or 8088 Micro- ; processor) true equ -1 false equ not true ;********************************************* ;* * ;      * ;* National "BLC 8538" Channel 0 for a serial* ;* 9600 baud printer - this board uses 8 Sig-* ;* netics 2651 Usarts which have on-chip baud* ;* rate generators. * ;* sector CX using table at [DX] mov bx,cx add bx,dx ;add sector to tran table address mov bl,[bx] ;get logical sector ret SETDMA: ;set DMA offset given by CX mov dma_adr,CX ret SETDMAB: ;set DMA segment given by CX mov dma_seg,CX ret ; ;print it inc BX jmps pmsg ;next character and loop ;********************************************* ;* * ;* Disk Input/Output Routines * ;* * ;*** | ;--------------------------------------------- ENDIF ;blc_list ret LISTST: ;poll list status IF blc_list ;--------------------------------------------- ;| | in al,lsts and al,81h ;look ax ;get our data segment mov bx,offset int_trp call pmsg hlt ;hardstop ;| | ;--------------------------------------------- ENDIF ;not loader_bios ;********************************************* ;*  * ;********************************************* mov al,0FFh out blc_reset,al ;reset all usarts on 8538 mov al,4Eh out ldata+2,al ;set usart 0 in async 8 bit mode mov al,3Eh out ldata+2,al ;set usart 0 to 9600 baud mov al,37h  GETSEGT: ;return address of physical memory table mov bx,offset seg_table ret ;********************************************* ;* * ;* All disk I/O parameters are setup: the * ;* Read and Write entry****************************************** SELDSK: ;select disk given by register CL mov bx,0000h cmp cl,2 ;this BIOS only supports 2 disks jnb return ;return w/ 0000 in BX if bad drive mov al, 80h cmp cl,0 jne sel1 ;drive 1 if not zero t both TxRDY and DTR cmp al,81h jnz zero_ret ;either false, printer is busy or al,255 ;both true, LPT is ready ;| | ;--------------------------------------------- ENDIF ;blc_list ret PUNCH: ;not im * ;* CP/M Character I/O Interface Routines * ;* Console is Usart (i8251a) on iSBC 86/12 * ;* at ports D8/DA * ;* * ;********************** out ldata+3,al ;enable Tx/Rx, and set up RTS,DTR ;| | ;--------------------------------------------- ENDIF ;not loader_bios IF loader_bios ;--------------------------------------------- ;|  points transfer one * ;* sector of 128 bytes to/from the current * ;* DMA address using the current disk drive * ;* * ;********************************************* READ: mov al,12h ;basic read sectormov al, 40h ;else drive is 0 sel1: mov sel_mask,al ;save drive select mask ;now, we need disk parameter address mov ch,0 mov bx,cx ;BX = word(CL) mov cl,4 shl bx,cl ;multiply drive code * 16 ;create offset from Disk Parameter Base add bx,oplemented in this configuration READER: mov al,1ah ret ;return EOF for now GETIOBF: mov al,0 ;TTY: for consistency ret ;IOBYTE not implemented SETIOBF: ret ;iobyte not implemented zero_ret: and al,0 ret ;return zero in AL and fl*********************** CONST: ;console status in al,csts and al,2 jz const_ret or al,255 ;return non-zero if RDA const_ret: ret ;Receiver Data Available CONIN: ;console input call const jz CONIN ;wait for RDA in al,cdata and a | ;This is a BIOS for the LOADER push ds ;save data segment mov ax,0 mov ds,ax ;point to segment zero ;BDOS interrupt offset mov bdos_offset,bdos_ofst mov bdos_segment,CS ;bdos interrupt segment pop ds ;restor command jmps r_w_common WRITE: mov al,0ah ;basic write sector command r_w_common: mov bx,offset io_com ;point to command string mov byte ptr 1[BX],al ;put command into string ; fall into execute and return execute: ;execute command strffset dp_base return: ret HOME: ;move selected disk to home position (Track 0) mov trk,0 ;set disk i/o to track zero mov bx,offset hom_com call execute jz return ;home drive and return if OK mov bx,offset bad_hom ;else print call pmsg ;"ags ; Routine to get and echo a console character ; and shift it to upper case uconecho: call CONIN ;get a console character push ax mov cl,al ;save and call CONOUT pop ax ;echo to console cmp al,'a' jb uret ;less than 'a' is ok cml,7fh ;read data and remove parity bit ret CONOUT: ;console output in al,csts and al,1 ;get console status jz CONOUT ;wait for TBE mov al,cl out cdata,al ;Transmitter Buffer Empty ret ;then return data LISTOUT: ;list device output e data segment ;| | ;--------------------------------------------- ENDIF ;loader_bios mov bx,offset signon call pmsg ;print signon message mov cl,0 ;default to dr A: on coldstart jmp ccp ;jump to coling. ;[BX] points to length, ; followed by Command byte, ; followed by length-1 parameter bytes mov last_com,BX ;save command address for retries outer_retry: ;allow some retrying mov rtry_cnt,max_retries retry: mov BX,last_com call senHome Error" jmps home ;and retry SETTRK: ;set track address given by CX mov trk,cl ;we only use 8 bits of track address ret SETSEC: ;set sector number given by cx mov sect,cl ;we only use 8 bits of sector address ret SECTRAN: ;translate p al,'z' ja uret ;greater than 'z' is ok sub al,'a'-'A' ;else shift to caps uret: ret ; utility subroutine to print messages pmsg: mov al,[BX] ;get next char from message test al,al jz return ;if zero return mov CL,AL call CONOUT  IF blc_list ;--------------------------------------------- ;| | call LISTST jz LISTOUT ;wait for printer not busy mov al,cl out ldata,al ;send char to TI 810 ;| d start entry of CCP WBOOT: jmp ccp+6 ;direct entry to CCP at command level IF not loader_bios ;--------------------------------------------- ;| | int_trap: cli ;block interrupts mov ax,cs mov ds,a     d_com ;transmit command to i8271 ; check status poll mov BX,last_com mov al,1[bx] ;get command op code mov cx,0800h ;mask if it will be "int req" cmp al,2ch jb exec_poll ;ok if it is an interrupt type mov cx,8080h ;else we use "not command rA,erB dw erC,erD,erE,erF er0 db cr,lf,'Null Error ??',0 er1 equ er0 er2 equ er0 er3 equ er0 er4 db cr,lf,'Clock Error :',0 er5 db cr,lf,'Late DMA :',0 er6 db cr,lf,'ID CRC Error :',0 er7 db cr,lf,'Data CRC Error :',0 er8 db cr,est al,20h ;test "parameter register full" bit jnz parm_poll ;idle until parm reg not full mov al,[BX] out fdc_parm,al ;send next parameter jmps parm_loop ;go see if there are more parameters ;********************************************* ;* ******************************* send_com: in al,fdc_stat test al,80h ;insure command not busy jnz send_com ;loop until ready ;see if we have to initialize for a DMA operation mov al,1[bx] ;get command byte cmp al,12h jne write_maybe ;it_ready jz nrdy01 ;now loop until drive ready jmps retry ;then go retry without decrement zret: and al,0 ret ;return with no error code wboot_l: ;can't make it w/ a short leap jmp WBOOT ;********************************************* ;*busy" and al,0fh cmp al,0ch ;unless there isn't mov al,0 ja exec_exit ; any result ;poll for bits in CH, exec_poll: ; toggled with bits in CL in al,fdc_stat ;read status and al,ch xor al,cl ; isolate what we want to poll jz exec_plf,'Drive Not Ready :',0 er9 db cr,lf,'Write Protect :',0 erA db cr,lf,'Trk 00 Not Found :',0 erB db cr,lf,'Write Fault :',0 erC db cr,lf,'Sector Not Found :',0 erD equ er0 erE equ er0 erF equ er0 nrdymsg equ er8 rtry_cnt db 0 ;disk  * ;* Data Areas * ;* * ;********************************************* data_offset equ offset $ dseg org data_offset ;contiguous with f not a read it could be write mov cl,40h jmps init_dma ;is a read command, go set DMA write_maybe: cmp al,0ah jne dma_exit ;leave DMA alone if not read or write mov cl,80h ;we have write, not read init_dma: ;we have a read or write operatio * ;* The i8271 requires a read status command * ;* to reset a drive-not-ready after the * ;* drive becomes ready * ;* * ;*****************oll ;and loop until it is done ;Operation complete, in al,fdc_rslt ; see if result code indicates error and al,1eh jz exec_exit ;no error, then exit ;some type of error occurred . . . cmp al,10h je dr_nrdy ;was it a not ready drive ? error retry counter last_com dw 0 ;address of last command string dma_adr dw 0 ;dma offset stored here dma_seg dw 0 ;dma segment stored here sel_mask db 40h ;select mask, 40h or 80h ; Various command strings for i8271 io_com db 3 ;length rdcode segment IF loader_bios ;--------------------------------------------- ;| | signon db cr,lf,cr,lf db 'CP/M-86 Version 2.2',cr,lf,0 ;| | ;-------------------n, setup DMA controller ; (CL contains proper direction bit) mov al,04h out dmac_mode,al ;enable dmac mov al,00 out dmac_cont,al ;send first byte to control port mov al,cl out dmac_cont,al ;load direction register mov ax,dma_adr ou**************************** test_ready: mov dh, 40h ;proper mask if dr 1 test sel_mask,80h jnz nrdy2 mov dh, 04h ;mask for dr 0 status bit nrdy2: mov bx,offset rds_com call send_com dr_poll: in al,fdc_stat ;get status word test al ;no, dr_rdy: ; then we just retry read or write dec rtry_cnt jnz retry ; up to 10 times ; retries do not recover from the ; hard error mov ah,0 mov bx,ax ;make error code 16 bits mov bx,errtbl[BX] call pmsg ;print appropriate message _wr db 0 ;read/write function code trk db 0 ;track # sect db 0 ;sector # hom_com db 2,29h,0 ;home drive command rds_com db 1,2ch ;read status command ; System Memory Segment Table segtable db 2 ;2 segments dw tpa_seg ;1st seg starts after BIO-------------------------- ENDIF ;loader_bios IF not loader_bios ;--------------------------------------------- ;| | signon db cr,lf,cr,lf db ' System Generated - 11 Jan 81',cr,lf,0 ;| t dmac_adr,al ;send low byte of DMA mov al,ah out dmac_adr,al ;send high byte mov ax,dma_seg out fdc_segment,al ;send low byte of segment address mov al,ah out fdc_segment,al ;then high segment address dma_exit: mov cl,[BX] ;get count ,80h jnz dr_poll ;wait for not command busy in al,fdc_rslt ;get "special result" test al,dh ;look at bit for this drive ret ;return status of ready ;********************************************* ;* *  in al,cdata ;flush usart receiver buffer call uconecho ;read upper case console character cmp al,'C' je wboot_l ;cancel cmp al,'R' je outer_retry ;retry 10 more times cmp al,'I' je z_ret ;ignore error or al,255 ;set code for permanent errS dw tpa_len ;and extends to 08000 dw 2000h ;second is 20000 - dw 2000h ;3FFFF (128k) include singles.lib ;read in disk definitions loc_stk rw 32 ;local stack for initialization stkbase equ offset $ lastoff equ offset $ tpa_seg equ (last | ;--------------------------------------------- ENDIF ;not loader_bios bad_hom db cr,lf,'Home Error',cr,lf,0 int_trp db cr,lf,'Interrupt Trap Halt',cr,lf,0 errtbl dw er0,er1,er2,er3 dw er4,er5,er6,er7 dw er8,er9,e inc BX mov al,[BX] ;get command or al,sel_mask ;merge command and drive code out fdc_com,al ;send command byte parm_loop: dec cl jz exec_exit ;no (more) parameters, return inc BX ;point to (next) parameter parm_poll: in al,fdc_stat t ;* Send_com sends a command and parameters * ;* to the i8271: BX addresses parameters. * ;* The DMA controller is also initialized * ;* if this is a read or write * ;* * ;**************or exec_exit: ret dr_nrdy: ;here to wait for drive ready call test_ready jnz retry ;if it's ready now we are done call test_ready jnz retry ;if not ready twice in row, mov bx,offset nrdymsg call pmsg ;"Drive Not Ready" nrdy01: call tes     off+0400h+15) / 16 tpa_len equ 0800h - tpa_seg db 0 ;fill last address for GENCMD ;********************************************* ;* * ;* Dummy Data Section * ;* ;--------------------------------------------- ENDIF ;not loader_bios IF loader_bios ;--------------------------------------------- ;| | ;This is a BIOS for the LOADER push ds ;save data segment mov ******************* ;* * ;* INIT Entry Point, Differs for LDBIOS and * ;* BIOS, according to "Loader_Bios" value * ;* * ;******************************************--------------------- ENDIF ;loader_bios cseg org ccpoffset ccp: org bios_code ;********************************************* ;* * ;* BIOS Jump Vector for Individual Routines * ;*  * ;* Revisions : * ;* * ;********************************************* true equ -1 false equ not true cr equ 0dh ;carriage return lf equ 0ah ;line feed ;********** * ;********************************************* dseg 0 ;absolute low memory org 0 ;(interrupt vectors) int0_offset rw 1 int0_segment rw 1 ; pad to system call vector rw 2*(bdos_int-1) bdos_offset rw 1 bdos_segment rw 1 ax,0 mov ds,ax ;point to segment zero ;BDOS interrupt offset mov bdos_offset,bdos_ofst mov bdos_segment,CS ;bdos interrupt segment ; (additional LOADER initialization) pop ds ;restore data segment ;| |*** INIT: ;print signon message and initialize hardware mov ax,cs ;we entered with a JMPF so use mov ss,ax ;CS: as the initial value of SS:, mov ds,ax ;DS:, mov es,ax ;and ES: ;use local stack during initialization mov sp,offset stkbase cl * ;********************************************* jmp INIT ;Enter from BOOT ROM or LOADER jmp WBOOT ;Arrive here from BDOS call 0 jmp CONST ;return console keyboard status jmp CONIN ;return console keyboard char jmp *********************************** ;* * ;* Loader_bios is true if assembling the * ;* LOADER BIOS, otherwise BIOS is for the * ;* CPM.SYS file. * ;*  END ,0 ; make dword mul spt ; compute sector of track add ax,sector ; add in current logical sector adc dx,0 ; make ;--------------------------------------------- ENDIF ;loader_bios mov bx,offset signon call pmsg ;print signon message mov cl,0 ;default to dr A: on coldstart jmp ccp ;jump to cold start entry of CCP WBOOT: jmp ccp+6 ;direct entry to CCP d ;set forward direction IF not loader_bios ;--------------------------------------------- ;| | ; This is a BIOS for the CPM.SYS file. ; Setup all interrupt vectors in low ; memory to address trap CONOUT ;write char to console device jmp LISTOUT ;write character to list device jmp PUNCH ;write character to punch device jmp READER ;return char from reader device jmp HOME ;move to trk 00 on cur sel drive jmp SELDSK ;select disk for ne * ;********************************************* loader_bios equ false bdos_int equ 224 ;reserved BDOS interrupt IF not loader_bios ;--------------------------------------------- ;| |  double precision add mov cx,128 ; length of a sector mul cx ; gives base offset as 32 bits mov dma_offset,ax ; gives base dma offset mov cl,12 ! shl dx,cl ; move to high nibble add dx,extra_base ; offset extra segment mov dma_segmeat command level IF not loader_bios ;--------------------------------------------- ;| | int_trap: cli ;block interrupts mov ax,cs mov ds,ax ;get our data segment mov bx,offset int_trp call pmsg push ds ;save the DS register mov IOBYTE,0 ;clear IOBYTE mov ax,0 mov ds,ax mov es,ax ;set ES and DS to zero ;setup interrupt 0 to address trap routine mov int0_offset,offset int_trap mov int0_segment,CS mov di,4 mov si,0 ;then propagatxt rd/write jmp SETTRK ;set track for next rd/write jmp SETSEC ;set sector for next rd/write jmp SETDMA ;set offset for user buff (DMA) jmp READ ;read a 128 byte sector jmp WRITE ;write a 128 byte sector jmp LISTST ;return list status bios_code equ 2500h ccp_offset equ 0000h bdos_ofst equ 0B06h ;BDOS entry point ;| | ;--------------------------------------------- ENDIF ;not loader_bios IF loader_bios ;--------------------------------- title 'Customized Basic I/O System' ;********************************************* ;* * ;* This Customized BIOS adapts CP/M-86 to * ;* the following hardware configuration * ;* Processor: hlt ;hardstop ;| | ;--------------------------------------------- ENDIF ;not loader_bios ;********************************************* ;* * ;* CP/M Character Ie mov cx,510 ;trap vector to rep movs ax,ax ;all 256 interrupts ;BDOS offset to proper interrupt mov bdos_offset,bdos_ofst pop ds ;restore the DS register ; (additional CP/M-86 initialization) ;| |  jmp SECTRAN ;xlate logical->physical sector jmp SETDMAB ;set seg base for buff (DMA) jmp GETSEGT ;return offset of Mem Desc Table jmp GETIOBF ;return I/O map byte (IOBYTE) jmp SETIOBF ;set I/O map byte (IOBYTE) ;**************************------------ ;| | bios_code equ 1200h ;start of LDBIOS ccp_offset equ 0003h ;base of CPMLOADER bdos_ofst equ 0406h ;stripped BDOS entry ;| | ;------------------------ * ;* Brand: * ;* Controller: * ;* * ;* * ;* Programmer:       /O Interface Routines * ;* * ;********************************************* CONST: ;console status rs 10 ;(fill-in) ret CONIN: ;console input call CONST jz CONIN ;wait for RDA rs 10 ;(fill-in the following program in ; the implementation of CP/M, MP/M or ; CP/NET for the 8086 or 8088 Micro- ; processor) true equ -1 false equ not true ;********************************************* ;* * ;econd is 20000 - dw 2000h ;3FFFF (128k) include singles.lib ;read in disk definitions loc_stk rw 32 ;local stack for initialization stkbase equ offset $ lastoff equ offset $ tpa_seg equ (lastoff+0400h+15) / 16 tpa_len equ 0800h - tpa_seg ******************************************* ;* * ;* Data Areas * ;* * ;********************************************* data_offset equ offi/o to track zero rs 10 ;(fill-in) ret SETTRK: ;set track address given by CX mov trk,CX ret SETSEC: ;set sector number given by cx mov sect,CX ret SECTRAN: ;translate sector CX using table at [DX] mov bx,cx add bx,dx ;add sector t) ret CONOUT: ;console output rs 10 ;(fill-in) ret ;then return data LISTOUT: ;list device output rs 10 ;(fill-in) ret LISTST: ;poll list status rs 10 ;(fill-in) ret PUNCH: ;write punch device rs 10 ;(fill-in) ret REA* Loader_bios is true if assembling the * ;* LOADER BIOS, otherwise BIOS is for the * ;* CPM.SYS file. Blc_list is true if we * ;* have a serial printer attached to BLC8538 * ;* Bdos_int is interrupt used for earlier * ;* versions. db 0 ;fill last address for GENCMD ;********************************************* ;* * ;* Dummy Data Section * ;* * ;*************************set $ dseg org data_offset ;contiguous with code segment IOBYTE db 0 disk db 0 ;disk number trk dw 0 ;track number sect dw 0 ;sector number dma_adr dw 0 ;DMA offset from DS dma_seg dw 0 ;DMA Base Segment IF loader_bios ;-------------------o tran table address mov bl,[bx] ;get logical sector ret SETDMA: ;set DMA offset given by CX mov dma_adr,CX ret SETDMAB: ;set DMA segment given by CX mov dma_seg,CX ret ; GETSEGT: ;return address of physical memory table mov bx,offseDER: rs 10 ;(fill-in) ret GETIOBF: mov al,IOBYTE ret SETIOBF: mov IOBYTE,cl ;set iobyte ret ;iobyte not implemented pmsg: mov al,[BX] ;get next char from message test al,al jz return ;if zero return mov CL,AL call CONOUT  * ;* * ;********************************************* loader_bios equ true blc_list equ true bdos_int equ 224 ;reserved BDOS Interrupt IF not loader_bios ;-------------------******************** dseg 0 ;absolute low memory org 0 ;(interrupt vectors) int0_offset rw 1 int0_segment rw 1 ; pad to system call vector rw 2*(bdos_int-1) bdos_offset rw 1 bdos_segment rw 1 END -------------------------- ;| | signon db cr,lf,cr,lf db 'CP/M-86 Version 1.0',cr,lf,0 ;| | ;--------------------------------------------- ENDIF ;loader_bios It seg_table ret ;********************************************* ;* * ;* All disk I/O parameters are setup: * ;* DISK is disk number (SELDSK) * ;* TRK is track number (SETTRK;print it inc BX jmps pmsg ;next character and loop ;********************************************* ;* * ;* Disk Input/Output Routines * ;* * ;****-------------------------- ;| | bios_code equ 2500h ccp_offset equ 0000h bdos_ofst equ 0B06h ;BDOS entry point ;| | ;--------------------------------------------- Entroller * ;* * ;* (Note: this file contains both embedded * ;* tabs and blanks to minimize the list file * ;* width for printing purposes. You may wish* ;* to expand the blanks before performing *F not loader_bios ;--------------------------------------------- ;| | signon db cr,lf,cr,lf db 'System Generated 00/00/00' db cr,lf,0 ;| | ;-----------------------) * ;* SECT is sector number (SETSEC) * ;* DMA_ADR is the DMA offset (SETDMA) * ;* DMA_SEG is the DMA segment (SETDMAB)* ;* READ reads the selected sector to the DMA* ;* address, and WRITE writes the data from * ;* the DMA***************************************** SELDSK: ;select disk given by register CL ndisks equ 2 ;number of disks (up to 16) mov disk,cl ;save disk number mov bx,0000h ;ready for error return cmp cl,ndisks ;n beyond max disks? jnb return ;retuNDIF ;not loader_bios IF loader_bios ;--------------------------------------------- ;| | bios_code equ 1200h ;start of LDBIOS ccp_offset equ 0003h ;base of CPMLOADER bdos_ofst equ 0406h ;stripped BDOS entr ;* major editing.) * ;********************************************* ; Copyright (C) 1980,1981 ; Digital Research, Inc. ; Box 579, Pacific Grove ; California, 93950 ; ; (Permission is hereby granted to use ; or abstract---------------------- ENDIF ;not loader_bios int_trp db cr,lf db 'Interrupt Trap Halt' db cr,lf ; System Memory Segment Table segtable db 2 ;2 segments dw tpa_seg ;1st seg starts after BIOS dw tpa_len ;and extends to 08000 dw 2000h ;s address to the selected sector * ;* (return 00 if successful, 01 if perm err)* ;* * ;********************************************* READ: rs 50 ;fill-in ret WRITE: rs 50 ;(fill-in) ret ;**rn if so mov ch,0 ;double(n) mov bx,cx ;bx = n mov cl,4 ;ready for *16 shl bx,cl ;n = n * 16 mov cx,offset dpbase add bx,cx ;dpbase + n * 16 return: ret ;bx = .dph HOME: ;move selected disk to home position (Track 0) mov trk,0 ;set disk        title 'COPYDISK 1 Feb 82' ver equ 20 ; Version 2.0 -jrp ; COPYDISK duplicates entire diskettes using all of the ; available storage as a multiple track buffer. ; This program must be built with a large extra segment ; as follows: ; ASMss mov si,offset reading_message ; point to read message mov ax,offset read ; and proper subroutine mov cl,source ; select source diskette call track_block mov si,offset writing_message ; point to write message mov ax,offset write ; ack,ax ; save value ; compute number of tracks that will ; fit in our data segment mov ax,extra_length ; get low 16 bits of DS length mov dl,extra_length_H ; get other 8 bits mov dh,0 ; zero rest of 32 bit divisor div track_sizelection call seldsk ; select destination drive test bx,bx ; insure drive exists jz drive_err ; no, go error out mov di,ES:word ptr 10[bx] ; point to destination DPB mov si,offset disk_def ; point to source drives def mov cx,15 ; leeldsk ; select it test bx,bx ; insure the drive exists jz drive_err ; no, fatal mov si,ES:word ptr 10[bx] ; get pointer to DPB ; create local copy of disk definition push ds ! push es ; save segments pop ds ! pop es ; and exchan86 COPYDISK ; GENCMD COPYDISK EXTRA[M0200,XFF00] ; This allows COPYDISK to utilize all the left-over memory in your ; system as its buffer. cseg ; code segment start: mov si,offset signon_message call pmsg ; print signon message nextnd proper subroutine mov cl,dest ; select destination call track_block mov si,offset verify_message ; point to verify message mov ax,offset verify mov cl,dest ; reselect destination call track_block mov ax,base_track sub ax,nts  ; divide buff_len / track_size mov NTS,ax ; save this value. cmp ax,2 ; must be at least 2 tracks jae adequite_memory ; ok, continue mov si,offset memory_message ; else print call pmsg ; error message aborting: ; here if exitinngth of a definition cld ! rep cmpsb ; compare the definitions je next_2 ; must be equal. jmp different_type ; else go print error next_2: mov dx,es:word ptr 00[bx] ; get secttran table address mov cx,0 ; logical sector zero call sge them mov di,offset disk_def ; point to local disk def table mov cx,15 ; diskdef is 15 bytes long cld ! rep movsb ; copy it push ds ! push es ; swap back pop ds ! pop es ; segment registers mov dx,es:word ptr 00[bx] ; get se_copy: ; reload local stack for retries. pushf ; save interrupt flag in stack pop bx ; put it in bx cli ; disable interrupts mov ax,ds ; get our data segment mov ss,ax ; and use as stack segment mov sp,offset stack_end ; ; adjust base track by number we copied mov base_track,ax jmps next_block next_block_x: ; here, we are done with a sucessful copy mov si,offset done_message ; print message call pmsg ; announcing success another: mov si,offset anotg because of error mov si,offset abort_message call pmsg jmp another adequite_memory: mov si,offset ready_message ; insure this is correct call get_yn ; print request jc aborting ; if NO, then get new input mov si,offset copy_mesectran ; find out first sector number cmp bx,base_sector ; make sure its the same je next_3 ; the same is OK, jmp different_type ; no, fatal error next_3: ; determine track capacity mov ax,spt ; get the sectors per track mov dcttran table address mov cx,0 ; logical sector zero call sectran ; find out first sector number mov base_sector,bx ; save this for track reads mov si,offset dest_message ; prompt for destination call get_drive ; get the drive code  set stack pointer push bx ; flags back into stack popf ; restore interrupt status mov si,offset source_message ; prompt for source drive call get_drive ; request drive code cmp al, cr - 'A' ; see if it was a jne next_1 ; nher_message call getyn ; see if we want another copy jc exit ; no, go exit next_copy_v: ; convienient for short jumps jmp next_copy ; back for another disk copy exit: ; here, we are exiting mov si,offset exit_message call psage ; else tell user OK. call pmsg mov ax,max_track ; get maximum track number mov base_track,ax ; save as outer loop index next_block: mov ax,base_track ; get loop index cmp ax,0 ; see if we are outside limits jl next_block_x l,128 ; length of a sector mul dl ; get track capacity mov track_size,ax ; save it ; determine number of tracks on diskette mov al,blm ; get block mask inc al ; plus 1 gives sectors/block mov ah,0 ; make 16 bits mov dx,0 cmp al,source ; see if same as source jne not_same ; no, go see if > max mov si,offset same_message ; can't have same drive call pmsg ; so we print message jmp another ; and go try again not_same: cmp al,drive_cnt ; is dest > mao, continue jmp exit ; yes, we should exit next_1: cmp al,drive_cnt ; see if valid drive code jb save_source ; yes, go save it drive_err: mov si,offset bad_drive ; else, print call pmsg ; a bad drive message jmp another ; and tmsg mov cl,13 int BDOS mov cl,0 ; reboot mov dl,0 ; CP/M-86 int BDOS different_type: mov si,offset type_error_message call pmsg jmp aborting track_block: mov message_pointer,si ; save pointer to message mov disk_functio; yes, terminate loop sub ax,nts ; lower by number of tracks per buffer inc ax ; and adjust by 1. jns not_neg ; check to make sure its positive mov ax,0 ; no, zero is floor not_neg: mov btr,ax ; save as last track for this copy pa ; make 32 bits mul dsm ; total sectors/data area add ax,spt ; force round up dec ax ; by adding SPT-1 div spt ; compute number of tracks add ax,off ; add in operating sys tracks dec ax ; number of last track mov max_trax? jnb drive_err ; go print invalid drive error mov dest,al ; save destination drive add al,'A' ; make ascii drive code mov dest_ascii,al ; save for messages mov cl,dest ; get destination drive mov dl,0 ; force first time sery to get another save_source: mov source,al ; save it as the source drive add al,'A' ; make ascii drive code mov source_ascii,al ; save for messages mov cl,source ; get source drive mov dl,0 ; force first time selection call s      n,ax ; save pointer to read/write mov selected_disk,cl ; save drive select code mov dl,1 ; tell bios have selected before call seldsk ; select diskette drive mov ax,base_track ; get base track number for this pass mov trk,ax ; save a no carry cmp al,'N' ; see if was 'N' jne get_yn ; no, invalid. reprompt stc ; set carry for a NO get_yn_x: ret get_char: ; read a line from CONIN and return first char mov cl,10 ; function for line in mov dx,offset line_buff jmps bios_call setsec: mov al,11 jmps bios_call setdma: mov al,12 jmps bios_call setdmab: mov al,17 jmps bios_call read: mov al,13 jmps bios_call write: mov al,14 jmps bios_call sectran: mov al,16 jmps bios_call  new disks next_5: call crlf no_disk_error: pop cx ; recover sector number inc cx ; sector = sector + 1 cmp cx,spt ; see if past last sector jae next_6 ; done, exit jmp next_sector ; else, continue next_6: dec trk ; track nt,dx ; save DMA segment mov cx,dx ; put in argument register call setdmab ; pass to CBIOS mov cx,dma_offset ; get the offset again call setdma ; and pass it to BIOS also mov ax,sector ; fetch current sector number inc ax ; s loop index next_track: ; first inner loop... mov ax,trk ; get the index cmp ax,btr ; see if less than last jnl next_4 ; no, continue jmp next_track_x ; yeah, exit loop next_4: mov si,message_pointer call pmsg ; print " Track " mov ax,trk ; get the track number call pdec ; print as decimal mov si,offset space_message ; then, print some call pmsg ; spaces to blank any garbage mov cx,trk ; get desired track address call settrk ; give to biosreturn a ret crlf: ; print a mov si,offset crlf_message ; fall into pmsg pmsg: ; print message at [SI] to zero lods al ; get a character test al,al ; see if zero terminator jz pmsg_x ; yes, exit push s************* get_drive: ; print message and read drive code call pmsg ; first, print the message call get_upper ; then get an upper case letter sub al,'A' ; and normalize to 0... ret get_upper: ; get upper case console input w/ ea segment call setdmab ; point dma base address call read ; read 128 byte record push ax ; save read error in stack mov si,offset verify_buffer ; point to sector we just read les di,dword ptr dma_offset ; get pointer to one we wrote nction ; read/write/verify a sector test al,al ; check error return code jz no_disk_error ; see if we got a bad sector ; got fatal disk error mov si,offset disk_error_message call pmsg ; print disk error mov si,message_pointer ;  mov cx,0 ; start with logical sector 0 next_sector: push cx ; save current sector number mov sector,cx ; save sector number (0 org) add cx,base_sector ; correct for first sector number call setsec ; pass to cbios ; compute di ; save pointer call conout ; not done, print character pop si ; recover pointer jmp pmsg ; and loop pmsg_x: ret conin: ; get character from console into AL mov cl,6 mov dl,0FFh int BDOS test al,al jz conin ret cocho call get_char ; get console character cmp al,'a' ; see if lower case jb get_upper_x ; below, leave cmp al,'z' ; insure not > z ja get_upper_x ; not lower at all sub al,'a'-'A' ; make upper get_upper_x: ret get_yn: ; pmov cx,128 ; 128 byte record cld ! rep cmpsb ; compare them mov al,0 ; no error je verify_good ; so we are ok mov al,0FFh ; else, we got compare error verify_good: pop dx ; recover read error byte or al,dl ; merge into retuget pointer to read/write inc si ; skip leading call pmsg ; print that mov ax,trk ; get track number call pdec ; print it mov si,offset sector_message ; print ", Sector " call pmsg mov ax,sector ; get sector number (0 org) ma address and segment mov ax,base_track ; get starting track number sub ax,trk ; gives relative track of pass mov dx,0 ; make dword mul spt ; compute sector of track add ax,sector ; add in current logical sector adc dx,0 ; makenout: ; output character in AL to console mov dl,al mov cl,6 int BDOS ret pdec: ; print unsigned 16 bits in AX as decimal ; with zero suppresion mov cx,0 ; cx is digit counter pdec_1: ; here to divide out next digit sub dxrint message and get Y or N push si ; save message pointer call pmsg ; print the message call get_upper ; get a upper case letter pop si ; recover message pointer cmp al,'Y' ; see if response was 'Y' je get_yn_x ; yes, return w/rn code ret ; back to caller ; *********************************** ; * ; * BIOS direct entry points ; * ; *********************************** home: mov al,8 jmps bios_call seldsk: mov al,9 jmps bios_call settrk: mov al,10  add ax,base_sector ; correct if 1 origin call pdec ; print the sector number mov si,offset continue_message ; see if user wants to ignore call get_yn ; ask for a Y/N response jnc next_5 ; yes, continue jmp aborting ; NO, go ask for double precision add mov cx,128 ; length of a sector mul cx ; gives base offset as 32 bits mov dma_offset,ax ; gives base dma offset mov cl,12 ! shl dx,cl ; move to high nibble add dx,extra_base ; offset extra segment mov dma_segme      ,dx ; Zero DX mov bx,10 ; constant 10 div bx ; quotient to AX, remainder to DX add dl,'0' ; make remainder ascii digit push dx ; and stick onto stack inc cx ; bump digit counter test ax,ax ; see if any quotient left jnz pdec_1 ntroller * ;* * ;* (Note: this file contains both embedded * ;* tabs and blanks to minimize the list file * ;* width for printing purposes. You may wish* ;* to expand the blanks before performing *ction db 0 ; force out data segment end ***** ;* * ;* Dummy Data Section * ;* de dest rb 1 ; destination drive select code selected_disk rb 1 ; current drive select code trk rw 1 ; current track number sector rw 1 ; current sector number (0 origin) nts rw 1 ; number of tracks per buffer full base_track rw 1 ; starting trac source_message db cr,lf,cr,lf,'Enter Source Disk Drive (A-D) ? ',0 dest_message db cr,lf,cr,lf,' Destination Disk Drive (A-D) ? ',0 ready_message db cr,lf,cr,lf,'Copying Disk ' source_ascii rb 1 db ': to Disk ' dest_ascii rb 1 db ':',cr,lf  ; yes, continue stacking digits pdec_2: pop ax ; get a digit from the stack push cx ; save count call conout ; print it pop cx ; restore count loop pdec_2 ; and continue if more in stack ret ; done. . . ; ** DATA SEGMENT ;* major editing.) * ;********************************************* ; Copyright (C) 1980,1981 ; Digital Research, Inc. ; Box 579, Pacific Grove ; California, 93950 ; ; (Permission is hereby granted to use ; or abstract * ;********************************************* dseg 0 ;absolute low memory org 0 ;(interrupt vectors) int0_offset rw 1 int0_segment rw 1 ; pad to system call vector rw 2*(bdos_int-1) bdos_offset rw 1 bdos_segment rw 1 k number for this pass track_size rw 1 ; size of each track in bytes btr rw 1 ; last track number of this pass dma_offset rw 1 ; current buffer offset dma_segment rw 1 ; current buffer segment base message_pointer rw 1 ; points to appropriate read/wr db 'Is this what you want to do (Y/N) ? ',0 memory_message db cr,lf,'Insufficient memory available for copy',0 abort_message db cr,lf,cr,lf,'Copy aborted',cr,lf,0 done_message db cr,lf,'Copy completed.',0 another_message db cr,lf,cr,lf,'Copy  ** dseg cr equ 0dh ; ascii carriage return lf equ 0ah ; ascii line feed drive_cnt equ 16 ; CP/M currently supports up to 16 drives BDOS equ 224 ; system call interrupt number ; CP/M-86 Page Zero code_length rw 1 ; low 16 bits  the following program in ; the implementation of CP/M, MP/M or ; CP/NET for the 8086 or 8088 Micro- ; processor) true equ -1 false equ not true ;********************************************* ;* * ; END bios_code ;********************************************* ;* * ;* BIOS Jump Vectorite message disk_function rw 1 ; points to '' '' '' subroutine base_sector rw 1 ; either 0 or 1 normally max_track rw 1 ; total number of tracks on disk line_buff db 80 db 0 rb 80 bios_function rb 1 ; bios function number bios_another disk (Y/N) ? ',0 copy_message db cr,lf,'Copy started',cr,lf,0 reading_message db cr,' Reading Track ',0 writing_message db cr,' Writing Track ',0 verify_message db cr,'Verifying Track ',0 space_message db ' ',0 bad_drive dbcode length code_length_H rb 1 ; high 8 bits '' '' code_base rw 1 ; base of the code segment model_8080 rb 1 ; 8080 memory model flag data_length rw 1 ; low 16 bits data length data_length_H rb 1 ; high 8 bits '' '' data_base rw 1 ; base * Loader_bios is true if assembling the * ;* LOADER BIOS, otherwise BIOS is for the * ;* CPM.SYS file. Blc_list is true if we * ;* have a serial printer attached to BLC8538 * ;* Bdos_int is interrupt used for earlier * ;* versions.  for Individual Routines * ;* * ;********************************************* jmp INIT ;Enter from BOOT ROM or LOADER jmp WBOOT ;Arrive here from BDOS call 0 jmp CONST ;return console keyboard status cx rw 1 ; first argument for BIOS call bios_dx rw 1 ; second argument for BIOS call disk_def rs 0 ; disk definition table gets copied here spt rw 1 ; 128 byte sectors per track bsh rb 1 ; block shift factor blm rb 1 ; block mask exm rb 1 ;  cr,lf,'Illegal Diskette Drive',cr,lf,0 same_message db cr,lf,'Source and Destination cannot be the same' db cr,lf,0 type_error_message db cr,lf,'Source and Destination disks must be' db cr,lf,'the same type',cr,lf,0 continue_message db cr,lof the data segment rs 1 ; not used extra_length rw 1 ; low 16 bits extra length extra_length_H rb 1 ; high 8 bits '' '' extra_base rw 1 ; base of the extra segment org 005Ch default_FCB rs 35 ; default File Control Block org 00 * ;* * ;********************************************* loader_bios equ true blc_list equ true bdos_int equ 224 ;reserved BDOS Interrupt IF not loader_bios ;------------------- title '8086 Disk I/O Drivers' ;********************************************* ;* * ;* Basic Input/Output System (BIOS) for * ;* CP/M-86 Configured for iSBC 86/12 with * ;* the iSBC 204 Floppy Disk Coextent mask dsm rw 1 ; disk size in blocks drm rw 1 ; directory size al0 rb 1 ; alloc 0 al1 rb 1 ; alloc 1 cks rw 1 ; checksum size off rw 1 ; directory offset rw 128 stack_end rw 0 verify_buffer rs 128 ; sector buffer for verify funf,'Ignore error (Y/N) ? ',0 sector_message db ', Sector ',0 disk_error_message db cr,lf,'Permanent Error ',0 crlf_message db cr,lf,0 exit_message db cr,lf,'COPY program exiting',cr,lf,0 ; VARIABLES source rb 1 ; source drive select co80h default_buffer rs 128 ; default record buffer org 0100h ; start of user data segment ; MESSAGES signon_message db cr,lf,'CP/M-86 Full Disk COPY Utility' db cr,lf,' Version ' db ver/10+'0', '.', (ver mod 10)+'0',cr,lf,0       -------------------------- ;| | bios_code equ 2500h ccp_offset equ 0000h bdos_ofst equ 0B06h ;BDOS entry point ;| | ;--------------------------------------------- E | ;This is a BIOS for the LOADER push ds ;save data segment mov ax,0 mov ds,ax ;point to segment zero ;BDOS interrupt offset mov bdos_offset,bdos_ofst mov bdos_segment,CS ;bdos interrupt segment pop ds ;restorerupt vectors in low ; memory to address trap push ds ;save the DS register mov ax,0 mov ds,ax mov es,ax ;set ES and DS to zero ;setup interrupt 0 to address trap routine mov int0_offset,offset int_trap mov int0_segment,CS mov di,4 mcur sel drive jmp SELDSK ;select disk for next rd/write jmp SETTRK ;set track for next rd/write jmp SETSEC ;set sector for next rd/write jmp SETDMA ;set offset for user buff (DMA) jmp READ ;read a 128 byte sector jmp WRITE ;write a 128 esult fdc_rst equ base204+2 ;8271 out reset dmac_adr equ base204+4 ;8257 DMA base address out dmac_cont equ base204+5 ;8257 out control dmac_scan equ base204+6 ;8257 out scan control dmac_sadr equ base204+7 ;8257 out scan address dmac_mode equ base2NDIF ;not loader_bios IF loader_bios ;--------------------------------------------- ;| | bios_code equ 1200h ;start of LDBIOS ccp_offset equ 0003h ;base of CPMLOADER bdos_ofst equ 0406h ;stripped BDOS entr data segment ;| | ;--------------------------------------------- ENDIF ;loader_bios mov bx,offset signon call pmsg ;print signon message mov cl,0 ;default to dr A: on coldstart jmp ccp ;jump to coldov si,0 ;then propagate mov cx,510 ;trap vector to rep movs ax,ax ;all 256 interrupts ;BDOS offset to proper interrupt mov bdos_offset,bdos_ofst pop ds ;restore the DS register ;********************************************* ;* byte sector jmp LISTST ;return list status jmp SECTRAN ;xlate logical->physical sector jmp SETDMAB ;set seg base for buff (DMA) jmp GETSEGT ;return offset of Mem Desc Table jmp GETIOBF ;return I/O map byte (IOBYTE) jmp SETIOBF ;set I/O m04+8 ;8257 out mode dmac_stat equ base204+8 ;8257 in status fdc_sel equ base204+9 ;FDC select port (not used) fdc_segment equ base204+10 ;segment address register reset_204 equ base204+15 ;reset entire interface max_retries equ 10 ;max retries ony ;| | ;--------------------------------------------- ENDIF ;loader_bios csts equ 0DAh ;i8251 status port cdata equ 0D8h ; " data port IF blc_list ;---------------------------------------------  start entry of CCP WBOOT: jmp ccp+6 ;direct entry to CCP at command level IF not loader_bios ;--------------------------------------------- ;| | int_trap: cli ;block interrupts mov ax,cs mov ds,ax * ;* National "BLC 8538" Channel 0 for a serial* ;* 9600 baud printer - this board uses 8 Sig-* ;* netics 2651 Usarts which have on-chip baud* ;* rate generators. * ;* ap byte (IOBYTE) ;********************************************* ;* * ;* INIT Entry Point, Differs for LDBIOS and * ;* BIOS, according to "Loader_Bios" value * ;*  disk i/o ;before perm error cr equ 0dh ;carriage return lf equ 0ah ;line feed cseg org ccpoffset ccp: org bios_code ;********************************************* ;* * ;* BIOS Jump Vector ;| | lsts equ 41h ;2651 No. 0 on BLC8538 status port ldata equ 40h ; " " " " " data port blc_reset equ 60h ;reset selected USARTS on BLC8538 ;| | ;------ ;get our data segment mov bx,offset int_trp call pmsg hlt ;hardstop ;| | ;--------------------------------------------- ENDIF ;not loader_bios ;********************************************* ;*  * ;********************************************* mov al,0FFh out blc_reset,al ;reset all usarts on 8538 mov al,4Eh out ldata+2,al ;set usart 0 in async 8 bit mode mov al,3Eh out ldata+2,al ;set usart 0 to 9600 baud mov al,37h  * ;********************************************* INIT: ;print signon message and initialize hardware mov ax,cs ;we entered with a JMPF so use mov ss,ax ; CS: as the initial value of SS:, mov ds,ax ; DS:, mov es,ax ; and ES: ;use local stack for Individual Routines * ;* * ;********************************************* jmp INIT ;Enter from BOOT ROM or LOADER jmp WBOOT ;Arrive here from BDOS call 0 jmp CONST ;return console keyboard status --------------------------------------- ENDIF ;blc_list ;********************************************* ;* * ;* Intel iSBC 204 Disk Controller Ports * ;* * ;** * ;* CP/M Character I/O Interface Routines * ;* Console is Usart (i8251a) on iSBC 86/12 * ;* at ports D8/DA * ;* * ;*********************** out ldata+3,al ;enable Tx/Rx, and set up RTS,DTR ;| | ;--------------------------------------------- ENDIF ;not loader_bios IF loader_bios ;--------------------------------------------- ;|  during initialization mov sp,offset stkbase cld ;set forward direction IF not loader_bios ;--------------------------------------------- ;| | ; This is a BIOS for the CPM.SYS file. ; Setup all inter jmp CONIN ;return console keyboard char jmp CONOUT ;write char to console device jmp LISTOUT ;write character to list device jmp PUNCH ;write character to punch device jmp READER ;return char from reader device jmp HOME ;move to trk 00 on ******************************************* base204 equ 0a0h ;SBC204 assigned address fdc_com equ base204+0 ;8271 FDC out command fdc_stat equ base204+0 ;8271 in status fdc_parm equ base204+1 ;8271 out parameter fdc_rslt equ base204+1 ;8271 in r     ********************** CONST: ;console status in al,csts and al,2 jz const_ret or al,255 ;return non-zero if RDA const_ret: ret ;Receiver Data Available CONIN: ;console input call const jz CONIN ;wait for RDA in al,cdata and al ;no, dr_rdy: ; then we just retry read or write dec rtry_cnt jnz retry ; up to 10 times ; retries do not recover from the ; hard error mov ah,0 mov bx,ax ;make error code 16 bits mov bx,errtbl[BX] call pmsg ;print appropriate message command jmps r_w_common WRITE: mov al,0ah ;basic write sector command r_w_common: mov bx,offset io_com ;point to command string mov byte ptr 1[BX],al ;put command into string ; fall into execute and return execute: ;execute command strifset dp_base return: ret HOME: ;move selected disk to home position (Track 0) mov trk,0 ;set disk i/o to track zero mov bx,offset hom_com call execute jz return ;home drive and return if OK mov bx,offset bad_hom ;else print call pmsg ;"Hgs ; Routine to get and echo a console character ; and shift it to upper case uconecho: call CONIN ;get a console character push ax mov cl,al ;save and call CONOUT pop ax ;echo to console cmp al,'a' jb uret ;less than 'a' is ok cmp,7fh ;read data and remove parity bit ret CONOUT: ;console output in al,csts and al,1 ;get console status jz CONOUT ;wait for TBE mov al,cl out cdata,al ;Transmitter Buffer Empty ret ;then return data LISTOUT: ;list device output  in al,cdata ;flush usart receiver buffer call uconecho ;read upper case console character cmp al,'C' je wboot_l ;cancel cmp al,'R' je outer_retry ;retry 10 more times cmp al,'I' je z_ret ;ignore error or al,255 ;set code for permanent errong. ;[BX] points to length, ; followed by Command byte, ; followed by length-1 parameter bytes mov last_com,BX ;save command address for retries outer_retry: ;allow some retrying mov rtry_cnt,max_retries retry: mov BX,last_com call sendome Error" jmps home ;and retry SETTRK: ;set track address given by CX mov trk,cl ;we only use 8 bits of track address ret SETSEC: ;set sector number given by cx mov sect,cl ;we only use 8 bits of sector address ret SECTRAN: ;translate s al,'z' ja uret ;greater than 'z' is ok sub al,'a'-'A' ;else shift to caps uret: ret ; utility subroutine to print messages pmsg: mov al,[BX] ;get next char from message test al,al jz return ;if zero return mov CL,AL call CONOUT  IF blc_list ;--------------------------------------------- ;| | call LISTST jz LISTOUT ;wait for printer not busy mov al,cl out ldata,al ;send char to TI 810 ;| r exec_exit: ret dr_nrdy: ;here to wait for drive ready call test_ready jnz retry ;if it's ready now we are done call test_ready jnz retry ;if not ready twice in row, mov bx,offset nrdymsg call pmsg ;"Drive Not Ready" nrdy01: call test_com ;transmit command to i8271 ; check status poll mov BX,last_com mov al,1[bx] ;get command op code mov cx,0800h ;mask if it will be "int req" cmp al,2ch jb exec_poll ;ok if it is an interrupt type mov cx,8080h ;else we use "not command bector CX using table at [DX] mov bx,cx add bx,dx ;add sector to tran table address mov bl,[bx] ;get logical sector ret SETDMA: ;set DMA offset given by CX mov dma_adr,CX ret SETDMAB: ;set DMA segment given by CX mov dma_seg,CX ret ; ;print it inc BX jmps pmsg ;next character and loop ;********************************************* ;* * ;* Disk Input/Output Routines * ;* * ;**** | ;--------------------------------------------- ENDIF ;blc_list ret LISTST: ;poll list status IF blc_list ;--------------------------------------------- ;| | in al,lsts and al,81h ;look at_ready jz nrdy01 ;now loop until drive ready jmps retry ;then go retry without decrement zret: and al,0 ret ;return with no error code wboot_l: ;can't make it w/ a short leap jmp WBOOT ;********************************************* ;* usy" and al,0fh cmp al,0ch ;unless there isn't mov al,0 ja exec_exit ; any result ;poll for bits in CH, exec_poll: ; toggled with bits in CL in al,fdc_stat ;read status and al,ch xor al,cl ; isolate what we want to poll jz exec_po GETSEGT: ;return address of physical memory table mov bx,offset seg_table ret ;********************************************* ;* * ;* All disk I/O parameters are setup: the * ;* Read and Write entry ***************************************** SELDSK: ;select disk given by register CL mov bx,0000h cmp cl,2 ;this BIOS only supports 2 disks jnb return ;return w/ 0000 in BX if bad drive mov al, 80h cmp cl,0 jne sel1 ;drive 1 if not zero m both TxRDY and DTR cmp al,81h jnz zero_ret ;either false, printer is busy or al,255 ;both true, LPT is ready ;| | ;--------------------------------------------- ENDIF ;blc_list ret PUNCH: ;not imp * ;* The i8271 requires a read status command * ;* to reset a drive-not-ready after the * ;* drive becomes ready * ;* * ;******************ll ;and loop until it is done ;Operation complete, in al,fdc_rslt ; see if result code indicates error and al,1eh jz exec_exit ;no error, then exit ;some type of error occurred . . . cmp al,10h je dr_nrdy ;was it a not ready drive ? points transfer one * ;* sector of 128 bytes to/from the current * ;* DMA address using the current disk drive * ;* * ;********************************************* READ: mov al,12h ;basic read sector ov al, 40h ;else drive is 0 sel1: mov sel_mask,al ;save drive select mask ;now, we need disk parameter address mov ch,0 mov bx,cx ;BX = word(CL) mov cl,4 shl bx,cl ;multiply drive code * 16 ;create offset from Disk Parameter Base add bx,oflemented in this configuration READER: mov al,1ah ret ;return EOF for now GETIOBF: mov al,0 ;TTY: for consistency ret ;IOBYTE not implemented SETIOBF: ret ;iobyte not implemented zero_ret: and al,0 ret ;return zero in AL and fla     *************************** test_ready: mov dh, 40h ;proper mask if dr 1 test sel_mask,80h jnz nrdy2 mov dh, 04h ;mask for dr 0 status bit nrdy2: mov bx,offset rds_com call send_com dr_poll: in al,fdc_stat ;get status word test al,e it mov cl,makef mov dx,offset fcb call bdos inc al ;err 255 becomes zero jnz ready ; ; cannot create file, directory full mov dx,offset nospace call print jmp abort ;back to ccp ;wr db 0 ;read/write function code trk db 0 ;track # sect db 0 ;sector # hom_com db 2,29h,0 ;home drive command rds_com db 1,2ch ;read status command ; System Memory Segment Table segtable db 2 ;2 segments dw tpa_seg ;1st seg starts after BIOS------------------------- ENDIF ;loader_bios IF not loader_bios ;--------------------------------------------- ;| | signon db cr,lf,cr,lf db ' System Generated - 11 Jan 81',cr,lf,0 ;|  dmac_adr,al ;send low byte of DMA mov al,ah out dmac_adr,al ;send high byte mov ax,dma_seg out fdc_segment,al ;send low byte of segment address mov al,ah out fdc_segment,al ;then high segment address dma_exit: mov cl,[BX] ;get count 80h jnz dr_poll ;wait for not command busy in al,fdc_rslt ;get "special result" test al,dh ;look at bit for this drive ret ;return status of ready ;********************************************* ;* *  title 'LDCOPY Ver 1.1 Oct 81' vers equ 10 ; Copyright, (C) 1981 ; Digital Research, Inc. ; P.O. Box 579 ; Pacific Grove, CA 93950 ; LDCOPY is used to generate and propagate bootable CP/M-86 systems. ; It copies a CP/M-86 Loader image dw tpa_len ;and extends to 08000 dw 2000h ;second is 20000 - dw 2000h ;3FFFF (128k) include singles.lib ;read in disk definitions loc_stk rw 32 ;local stack for initialization stkbase equ offset $ lastoff equ offset $ tpa_seg equ (lasto | ;--------------------------------------------- ENDIF ;not loader_bios bad_hom db cr,lf,'Home Error',cr,lf,0 int_trp db cr,lf,'Interrupt Trap Halt',cr,lf,0 errtbl dw er0,er1,er2,er3 dw er4,er5,er6,er7 dw er8,er9,er inc BX mov al,[BX] ;get command or al,sel_mask ;merge command and drive code out fdc_com,al ;send command byte parm_loop: dec cl jz exec_exit ;no (more) parameters, return inc BX ;point to (next) parameter parm_poll: in al,fdc_stat te;* Send_com sends a command and parameters * ;* to the i8271: BX addresses parameters. * ;* The DMA controller is also initialized * ;* if this is a read or write * ;* * ;*************** (either from a disk file, or from ; the system tracks of an existing CP/M-86 system diskette) to a new ; diskette. ; The following equates will require modification for different ; diskette formats. For convienence, they are only referenced ; by aff+0400h+15) / 16 tpa_len equ 0800h - tpa_seg db 0 ;fill last address for GENCMD ;********************************************* ;* * ;* Dummy Data Section * ;* A,erB dw erC,erD,erE,erF er0 db cr,lf,'Null Error ??',0 er1 equ er0 er2 equ er0 er3 equ er0 er4 db cr,lf,'Clock Error :',0 er5 db cr,lf,'Late DMA :',0 er6 db cr,lf,'ID CRC Error :',0 er7 db cr,lf,'Data CRC Error :',0 er8 db cr,lst al,20h ;test "parameter register full" bit jnz parm_poll ;idle until parm reg not full mov al,[BX] out fdc_parm,al ;send next parameter jmps parm_loop ;go see if there are more parameters ;********************************************* ;* ****************************** send_com: in al,fdc_stat test al,80h ;insure command not busy jnz send_com ;loop until ready ;see if we have to initialize for a DMA operation mov al,1[bx] ;get command byte cmp al,12h jne write_maybe ;if pair of data bytes near the end of the data segment. ; In addition, the skew table in the data area will need modification. sdspt equ 26 ; number of sectors per track sdlt equ 2 ; " of tracks for loader ; *********** * ;********************************************* dseg 0 ;absolute low memory org 0 ;(interrupt vectors) int0_offset rw 1 int0_segment rw 1 ; pad to system call vector rw 2*(bdos_int-1) bdos_offset rw 1 bdos_segment rw 1 f,'Drive Not Ready :',0 er9 db cr,lf,'Write Protect :',0 erA db cr,lf,'Trk 00 Not Found :',0 erB db cr,lf,'Write Fault :',0 erC db cr,lf,'Sector Not Found :',0 erD equ er0 erE equ er0 erF equ er0 nrdymsg equ er8 rtry_cnt db 0 ;disk e * ;* Data Areas * ;* * ;********************************************* data_offset equ offset $ dseg org data_offset ;contiguous with c not a read it could be write mov cl,40h jmps init_dma ;is a read command, go set DMA write_maybe: cmp al,0ah jne dma_exit ;leave DMA alone if not read or write mov cl,80h ;we have write, not read init_dma: ;we have a read or write operation*************** ; * ; * global equates ; * ; ************************** bdosint equ 224 ;BDOS interrupt number false equ 0 true equ not false cr equ 0dh ;carriage return lf equ 0ah ;line feed sdndisks equ 16 ; maximum num END  call bdos inc al ;err 255 becomes zero jnz ready ; ; cannot open file, so creatrror retry counter last_com dw 0 ;address of last command string dma_adr dw 0 ;dma offset stored here dma_seg dw 0 ;dma segment stored here sel_mask db 40h ;select mask, 40h or 80h ; Various command strings for i8271 io_com db 3 ;length rd_ode segment IF loader_bios ;--------------------------------------------- ;| | signon db cr,lf,cr,lf db 'CP/M-86 Version 1.1',cr,lf,0 ;| | ;--------------------, setup DMA controller ; (CL contains proper direction bit) mov al,04h out dmac_mode,al ;enable dmac mov al,00 out dmac_cont,al ;send first byte to control port mov al,cl out dmac_cont,al ;load direction register mov ax,dma_adr out     ber of drives sdsecsiz equ 128 ; size of each sector tpa equ 100h fcbaddr equ 5ch fcbname equ fcbaddr + 1 ;1st char of file name fcbtype equ fcbaddr + 9 ;file type fcbcr equ fcbaddr + 32 ;current record cseg jmp start db ' COPYRIGHT (C) cr jne reboot1 ;local jmp then to reboot, >128 ;typed a cr, ok to ignore call crlf jmp rwsec endtrk: ;end of track mov cx,spt ;sectors per track call multsec ;*secsiz mov bx,dmaddr ;base dma for this track add bx,cx k mov sector,-1 ;counts 0, 1, 2, . . . 25 ;sector incremented before read or write rwsec: ;read or write sector inc sector ;to next sector mov bx,sector ;current sector cmp bx,spt ;sectors per track jz endtrk ;read or write sectoall done if cr jz pboot ;this is normal program exit point mov ah,al ;save ascii drive letter sub al,'A' ;make it a number cmp al,ndisks jb putc call baddisk ;invalid drive name jmp putldr ;to try again putc: mov pdisk,ah ;drive letcx ;don't read to far jz don or al,al ;0 if read ok jnz badrd add dx,secsiz ;inc dma by sector size jmp rdinp don: ret badrd: ;read error encountered in input file mov dx,offset badfile call crmsg jmp reboot ; ************1981, DIGITAL RESEARCH ' rs 100h ; Emergency Patch Area (DRI) ; *********************** ; * ; * program begins here ; * ; *********************** start: mov ax,ds mov es,ax mov dx,offset signon call outmsg cmp byte ptr .fcbname,'  ;+ spt * secsiz mov dmaddr,bx ;ready for next track jmp rwtrk ;for another track endrw: ;end of read or write, return to caller ret reboot1:jmp reboot ;farther than 128 bytes ; *************************************r to or from l_5: ;current dma address mov si,offset tran add bx,bx ; double sector number mov cx,[bx+si] ;xlate to physical sector push si push cx call sec ;set up sector number pop cx pop si mov bx,[si] sub cx,bx ;tran(sector)-ter in message call sel ;select dest drive in al mov dx,offset putmsg call crmsg ;check with user for ok call getchar cmp al,cr ;user mistake if not cr, reboot jnz pboot call crlf mov rewr,1 ;set to write for getput call getput ;to p************** ; * ; * getldr: get CP/M loader from 1st N tracks ; * ; ************************** getldr: mov dx,offset askget call crmsg ;which drive is source on ? call getchar ;must get from disk - not from memory mov ah,al ;save asci' jz gl ;check for file given on command line call getfile ;read ldr from file jmp ps gl: call getldr ;read ldr from 1st 2 tracks ps: call putldr ;put ldr on " " " jmp reboot ; *************************** ; * ; * getfile: get the **** ; * ; * utility subroutines ; * ; **************************************** ; ;***** multsec: ;cx * sector size push dx ;return value in cx mov ax,secsiz mul cx mov cx,ax pop dx ret ;***** baddisk: mov dx,offset qdisk ;bad distran(0) call multsec ;cx * sector size add cx,dmaddr ;base of dma for this track ;+(tran(sector)-tran(0))*secsiz call dma ;dma address set from cx ;dma address set, clear retry count trysec: ;try tut loader back on diskette mov dx,offset done call outmsg jmp putldr ;for another put operation pboot: jmp reboot ;back to cp/m ; *********************** ; * ; * getput: get or put loader (rewr=0 for read, 1 for write) ; * disk is already i char sub al,'A' ;normalize drive number cmp al,ndisks ;valid drive? jb getc ;skip to getc if so call baddisk ;invalid drive number jmp getldr ;to try again getc: mov gdisk,ah ;ascii drive letter for message call sel ;to select the drfile specified in command tail into ram ; * ; *************************** getfile: cmp byte ptr .fcbtype,' ' jnz opn mov byte ptr .fcbtype, 'C' mov byte ptr .fcbtype + 1,'M' mov byte ptr .fcbtype + 2,'D' opn: mov dx,fcbaddr ;try to opk name call crmsg ret ; ********************** ; * ; * bdos subroutines ; * ; ********************** bdos: int bdosint ret ;function numbers in cl reset equ 0 ;warm boot coni equ 1 ;console input cono equ 2 ;console output pro read or write current sector or rewr,0 ;read or write? jz tryread ; Start of Patch 02 3/08/82 by rld as per DRI instructions mov cl,00 mov ax,track inc ax cmp ax,nlt jne normal_write mov ax,sector inc ax cmp ax,spt jne normal_writselected ; * ; *********************** getput: mov bx,offset loadp ;load point in ram for cp/m during LDCOPY mov dmaddr,bx ;clear track to 00 mov track,-1 ;start with track equal -1 rwtrk: ;read or write next track inc track ;track =ive in al call crlf mov dx,offset getmsg call outmsg ;make sure right drive call getchar cmp al,cr ;user mistake, no cr jnz gboot call crlf mov rewr,0 ;set to read for getput call getput mov dx,offset done call outmsg ret gboot:en it call open inc al ;255 becomes 00 jnz rdok ;ok to read if not 255 mov dx,offset nofile call crmsg ;file not present, error and reboot jmp reboot rdok: mov byte ptr .fcbcr,0 ;current record = 0 mov dx,offset loadp ;base of buffer str equ 9 ;print string rconb equ 10 ;read console buffer self equ 14 ;select disk openf equ 15 ;disk open setdmaf equ 26 ;where data will go dreadf equ 20 ;disk read biosf equ 50 ;bios call reboot: mov al,0 call sel call crlf moe mov cl,01 Normal_Write: ; End of Patch 02 installed rld 8/30/82 ;must be write call write jmp chkrw ;check for error returns tryread: call read chkrw: or al,al jz rwsec mov dx,offset errmsg call outmsg call getchar cmp al, track + 1 mov cx,track cmp cx,nlt ;number of loader tracks = current track ? jnz nxttrk ;end of this routine > 128 bytes jmp endrw ;end of read or write ;otherwise notdone, go to next track nxttrk: mov cx,track call trk ;to set trac jmp reboot ;back to cp/m ; ******************************* ; * ; * putldr: put CP/M loader on 1st N tracks ; * ; ******************************* putldr: mov dx,offset askput call crmsg ;what drive to put ldr call getchar cmp al,cr ; mov cx,maxsecs ;sector count rdinp: push cx push dx ;ready for dma call bdma ;bdos dma function mov dx,fcbaddr ;ready for read call dread pop dx ;recall dma address pop cx ;recall sector count cmp al,1 ;check for eof jz don dec      v cl,reset mov dl,0 ; release memory jmp bdos ;**** getchar: ;get an upper case char into al call getbuf ;use buffered console read cmp conbuf+1,0 ;just a crlf? mov al,cr jz ex mov al,conbuf+2 ;first char read cmp al,'a' ;translates constructed automatically by the ; GENCMD utility). ; CPMLDR may be read into any segment that does not ; overlap the desired system load segment as it makes ; all memory references using copies of the CS: register ; it is entered with. false now GETIOBF: mov al,0 ;TTY: for consistency ret ;IOBYTE not implemented SETIOBF: ret ;iobyte not implemented zero_ret: and al,0 ret ;return zero in AL and flags ; Routine to get and echo a console character ; and shift it to upperfor double density dw 0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0 ; (64 extra bytes reserved) ; ************************* ; * ; * variables ; * ; ************************ bds: ;bios data structure fnumn sel: ;select disk given by register a mov cl,al mov al,seldsk jmp bios ;**** trk: ;set up track mov al,settrk ;offset for settrk entry jmp bios ;gone to settrk ;**** sec: ;set up sector number mov al,setsec jmp bios ;*** to upper case if lower jb ex cmp al,'z' ja ex and al,5fh ;it is lower, make upper ex: ret ;**** getbuf: ;read console buffer mov cl,rconb mov dx,offset conbuf jmp bdos ;**** putchar: ;write character from al to console movequ 0 true equ not false cr equ 0dh lf equ 0ah lbios_offset equ 1200h ; offset of LBIOS biosoff equ 2500h ; offset of BIOS from start of CPM.SYS ; this is the entry point into CPM.SYS bootdrv equ 0 ; boot drive always zero  case uconecho: call CONIN ;get a console character push ax mov cl,al ;save and call CONOUT pop ax ;echo to console cmp al,'a' jb uret ;less than 'a' is ok cmp al,'z' ja uret ;greater than 'z' is ok sub al,'a'-'A' ;else shift to c rb 1 ;storage for bios parameters bcx rw 1 ;the bdos bios func puts these bdx rw 1 ;in registers before jumping to bios nlt dw sdlt ;number of loader tracks spt dw sdspt ;sectors per track ndisks db sdndisks ;number of disks secsiz dw * dma: ;set dma address to value of cx mov al,setdma jmp bios ;**** read: ;perform read operation mov al,readf jmp bios ;**** write: ;perform write operaton mov al,writf jmp bios ; ************************** ; * ; * data are dl,al mov cl,cono jmp bdos ;**** crlf: ;send carriage return, line feed mov al,cr call putchar mov al,lf call putchar ret ;**** crmsg: ;print message addressed by dx til zero ;with leading crlf push dx call crlf pop dx  ; 128 bytes of CPM.SYS lbdosoff equ 406H ;location of LBDOS in LOADER bdos_int equ 224 ;lbdos interrupt number ; dummy section for interrupt vectors dseg 0 org 0 abs_zero rw 2*bdosint bdos_offset rw 1 bdos_segment rw 1 ; bdos  title 'CP/M-86 Loader' ; The CPMLDR consists of this module along with the ; LDRBDOS and LBIOS. ; CPMLDR resides on the first two tracks of a ; CP/M-86 system diskette and is brought into memory ; by the ROM bootstrap loader to load initiate CP/sdsecsiz ;sector size maxsecs dw sdlt * sdspt ;maximum sectors to read from file sdisk rb 1 ;selected disk for current operation track rw 1 ;current track rewr rb 1 ;read if 0,write if 1 sector rw 1 ;current sector dmaddr dw 0 ;current dma addas ; * ; ************************** dseg org 0100h ; skip past page zero ;messages signon db 'LDCOPY VERS ' db vers/10+'0','.',vers mod 10+'0','$' askget db 'Source Drive Name $' getmsg db 'Source On ' gdisk rs 1 ;filled in at get ;drop thru to outmsg0 ;**** outmsg: mov cl,prstr jmp bdos ;dx has string addr ;**** bdma: ;dx has address mov cl,setdmaf jmp bdos ;**** dread: ;disk read function mov cl,dreadf jmp bdos ;**** open: ;file open function mov cfunction numbers coutf equ 2 pstrf equ 9 seldsk equ 14 openf equ 15 readsf equ 20 dmaf equ 26 dmabf equ 51 ;******************************* ;* ;* CPMLDR starts here ;* ;******************************* cseg org 0 ; JMPM-86 ; It opens the file 'CPM.SYS' using the LDRBDOS and LBIOS ; and then reads it into memory. Finally, a jump to the BIOS ; initialization entry point starts CP/M-86 ; The first 128 byte record of the CPM.SYS file is a header ; with the followinress retry rb 1 ;number of tries on this sector conbuf db 30 rb 32 ;console buffer ;make stack on even address loadp rs sdsecsiz*sdspt*sdlt db 0 ; force out last data segement byte end function db ', Then Type Return$' askput db 'Destination Drive Name (Or Return To Reboot) $' putmsg db 'Destination On ' pdisk rs 1 ;filled in at put function db ', Then Type Return$' errmsg db 'Permanent Error, Type Return To Ignore$' done db 'l,openf jmp bdos ;**** bios: mov fnum,al ;bios function number mov bcx,cx mov bdx,dx mov dx,offset(bds) mov cl,biosf jmp bdos ; **************************** ; * ; * bios utilities ; * ; **************************** seldsk equ 9 F to here from boot ROM jmp LBIOS ; allow loader BIOS to ; initialize start: ; loader BIOS jumps here xor ax,ax ! mov ds,ax ; temp DS at absolute zero mov bdos_offset,lbdosoff ; to patch in interrupt table mov bdos_segment,g format: ; ty rb 1 ;seg type (not used here) ; len rw 1 ;length (not used here) ; abs dw ldrstart ;absolute segment address for LOADER ; min rw 1 ;minimum mem (not used here) ; max rw 1 ;max mem needed (not used here) ; (This header record itus in al,lsts and al,81h ;look at both TxRDY and DTR cmp al,81h jnz zero_ret ;either false, printer is busy or al,255 ;both true, LPT is ready ret PUNCH: ;not implemented in this configuration READER: mov al,1ah ret ;return EOF for Function Complete$' qdisk db 'Invalid Drive Name$' nofile db 'No Source File On Disk$' badfile db 'Source File Read Error$' ;translate table tran dw 1,3,5,7,9,11,13,15,17,19,21,23,25 dw 2,4,6,8,10,12,14,16,18,20,22,24,26 ;leave room ;wboot+24 for disk select settrk equ 10 ;wboot+27 for set track function setsec equ 11 ;wboot+30 for set sector function setdma equ 12 ;wboot+33 for set dma address readf equ 13 ;wboot+36 for read function writf equ 14 ;wboot+39 for write functio     cs ; offset and segment mov ax,cs ! mov ss,ax ; make ss, ds, es = cs mov ds,ax ! mov es,ax mov sp,offset(stack) ; set up local stack call initlbdos ;warm up lbdos and lbios call openfnc ;open CPM.SYS cmp al,255 ! jne perr ; in2.2: check is ; shown below for illustration purposes. ; mov cl,version call bdos cmp al,20h ;version 2.0 or later? jnb versok ; bad version, message and go back mov dx,offset badver call print ; ;**************************************************** ;* * ;* Sample Random Access Program for CP/M-86 * ;* * ;********************************Disk$' rerr db cr,lf,'Error In Reading CPM.SYS$' segment db cr,lf,'Segment Address = $' lenmsg db cr,lf,' Last Offset = $' crlf db cr,lf,'$' ; vector for jmpf indirect to start CP/M bios dd abs_zero ; (dummy value) org offset bioseft 4 push cx ! push ax ; save crucial registers call pnib ; print hex nibble pop ax ! pop cx ; restore registers dec ch ! jnz lhex ; and loop four times ret pnib: ;print low nibble in AL as hex char and al,0fh ! cmp al,9 ja p10 ;abovsure good file mov dx,offset nofile ! call msg ; no CPM.SYS file jmp stop ; then halt the machine perr: mov dx,cs ! call setdmab mov dx,offset page1 ! call setdma ;read first page of CPM.SYS call read mov ax,word ptr page1+3 ;get abs fi jmp abort ; versok: ; correct version for random access mov cl,openf ;open default fct mov dx,offset fcb call bdos inc al ;err 255 becomes zero jnz ready ; ; cannot open file, so creat******************** ; ; BDOS Functions ; 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  ; overlay preceding with DW's biosstart dw biosoff ; first word is BIOS offset ldseg rw 1 ; second is segment to put CPM.SYS fcb db 0,'CPM ','SYS',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 org (offset $+1) and 0FFFEh ; even address fe 9 ? add al,'0' ;digit jmp prn p10: add al,'A'-10 ;char a-e prn: mov dl,al ;****** putchar: mov cl,coutf jmp sys_vec ;****** initlbdos: mov cl,seldsk ! mov dx,bootdrv ; select boot disk jmp sys_vec ;****** openfnc: mov cl,opeld from header mov ldseg,ax ; save it and mov dx,ax ! call setdmab ; set DMA segment for disk IO mov dx,offset segment ! call msg ; put memory map on console mov ax,ldseg ! call phex ; print base system segment ; mov dx,0 ;offset of Ce it mov cl,makef mov dx,offset fcb call bdos inc al ;err 255 becomes zero jnz ready ; ; cannot create file, directory full mov dx,offset nospace call print jmp abort ;back to ccp ; 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 ; ; Equateor stack rw 32 stack equ offset $ dseg org stack page1 rb 128 ; dummy section for BIOS init label org lbios_offset lbios: end enf ! mov dx,offset fcb ; fcb already initialized mov cl,openf jmp sys_vec ;******** ; setdma: ;set new dma addr in dx mov cl,dmaf jmp sys_vec ;******** ; setdmab: ; set new dma segment base from DX mov cl,dmabf jmp sys_vec ;PM in segment readit: call setdma ; set DMA offset for push dx ! call read ; next sector read cmp al,01H ! je done ; check for EOF cmp al,0 ! je prerr ; check for good write mov dx,offset rerr ! call msg ; print READ ERROR message  ; loop back to "ready" after each command ; ready: ; file is ready for processing ; call readcom ;read next command mov ranrec,dx ;store input record# mov ranovf,0h ;clear high byte if set cmp al,'Q' ;quit? jnz s for non graphic characters cr equ 0dh ;carriage return lf equ 0ah ;line feed ; ; ; load SP, ready file for random access ; cseg pushf ;push flags in CCP stack pop ax ;save flags in AX cli ;disable interrualid -1. push es ; save extra segment mov cur_disk,-1 ; insure initial pre-read sub ax,ax ; make a zero mov wr_flag,al ; clear the dirty buffer flag mov di,offset sec_flags ; point to the update flag list mov bx,ds ! mov es,bx ; ES****** ; pcrlf: mov dx,offset crlf ;print carriage return, line feed ;****** ; msg: ;print msg starting at dx until $ mov cl,pstrf ;print string function jmp sys_vec ;***** ; read: mov dx,offset fcb ! mov cl,readsf ; jmp sys_vec ; jmp stop ; hard stop on any error prerr: pop dx ! add dx,80h ; address for next record jmp readit done: mov dx,offset lenmsg ! call msg ; print length message pop ax ! dec ax ! call phex ; print last address call pcrlf ; and a crlf  notq ; ; quit processing, close file mov cl,closef mov dx,offset fcb call bdos inc al ;err 255 becomes 0 jz error ;error message, retry jmps abort ;back to ccp ; ; ; end of quit command, process write ; pts mov bx,ds ;set SS register to base of DATA group mov ss,bx ;set SS, SP with interrupts disabled mov sp,offset stack ; for 80888 push ax ;restore the flags popf ; ; CP/M-86 initial release returns the file ; system version number of  <- DS mov cx,host_spt ! cld ; set length and direction rep stosb ; zero the sector update flags mov cur_dma_seg,ds ; get our segment address pop es ; recover extra segment ret track_READ: mov io_com,4 ; read track takes 4 byte c****** ; sys_vec: int bdos_int ret ;****** ; stop: hlt ; hard stop 8086 for error jmp stop ;******************************** ;* ;* DATA AREA ;* ;******************************** nofile db cr,lf,'The File CPM.SYS Not Found On This  jmpf bios ; leap to BIOS initialization ;***************************** ;* ;* subroutines ;* ;***************************** ;****** phex: ;print 4 hex characters from ax mov cx,0404h ; 4 in both CH and CL lhex: rol ax,cl ; rotate l      ; notq: ; not the quit command, random write? cmp al,'W' jnz notw ; ; this is a random write, fill buffer until cr mov dx,offset datmsg call print ;data prompt mov cx,127 ;up to 127 characters mov bx,offset buff ;d;Base of Disk Parameter Blocks dpe0 dw xlt0,0000h ;Translate Table dw 0000h,0000h ;Scratch Area dw dirbuf,dpb0 ;Dir Buff, Parm Block dw csv0,alv0 ;Check, Alloc Vectors dpe1 dw xlt1,0000h ;Translate Table dw 0000h,0000h ;Scratch Area dw dirbuf,d datmsg db 'type data: $' errmsg db 'error, try again.$' prompt db 'next command? $' ; ; ; fixed and variable data area ; conbuf db conlen ;length of console buffer consiz rs 1 ;resulting siz line to the conbuf mov dx,offset prompt call print ;command? mov cl,rstring mov dx,offset conbuf call bdos ;read command line ; command line is present, scan it mov ax,0 ;start with 0000 mov bx,offset conlin readc: mo push cx ;save counter push si ;save next to get cmp al,' ' ;graphic? jb skipw ;skip output if not graphic call putchr ;output character skipw: pop si pop cx loop wloop ;decrement CX and check for 00 jmp ready ; ; ; estination rloop: ;read next character to buff push cx ;save loop conntrol push bx ;next destination call getchr ;character to AL pop bx ;restore destination pop cx ;restore counter cmp al,cr ;end of line? jz er title 'Track Buffered BIOS - SBC204' ; 5 Jan 82 -jrp ; Copyright (C) 1980,1981 ; Digital Research, Inc. ; Box 579, Pacific Grove ; California, 93950 ; ; (Permission is hereby granted to use ; or abstract the following program in ; the impe after read conlin rs 32 ;length 32 buffer conlen equ offset $ - offset consiz ; rs 31 ;16 level stack stack rb 1 db 0 ;end byte for GENCMD end v dl,[bx] ;next command character inc bx ;to next command position mov dh,0 ;zero high byte for add or dl,dl ;check for end of command jnz getnum ret ; not zero, numeric? getnum: sub dl,'0' cmp dl,10 ;carry if numeric jnb endrdend of read command, all errors end-up here ; ; error: mov dx,offset errmsg call print jmp ready ; ; BDOS entry subroutine bdos: int 224 ;entry to BDOS if by INT 224 ret ; abort: ;return to CCP mov cl,0 loop ; not end, store character mov byte ptr [bx],al inc bx ;next to fill loop rloop ;decrement cx ..loop if not 0 erloop: ; end of read loop, store 00 mov byte ptr [bx],0h ; ; write the record to selected record number mlementation of CP/M, MP/M or ; CP/NET for the 8086 or 8088 Micro- ; processor) true equ -1 false equ not true ; Track buffering equates... host_sectsiz equ 128 host_spt equ 26 host_fsn equ 1 bdos_int equ 224 bios_code equ 2500h ccp_o 3 ;length (changed to 4 to read a track) rd_wr db 0 ;read/write function code trk db 0 ;track # sect db 0 ;sector # sec_len db 26 ;transfer 26 sectors on a track read hom_com db 2,29h,0 ;home drive command rds_com db 1,2ch ;read status command  mov cl,10 mul cl ;multipy accumulator by 10 add ax,dx ;+digit jmps readc ;for another char endrd: ; end of read, restore value in a and return value in bx mov dx,ax ;return value in DX mov al,-1[bx] cmp al,'a' ;checall bdos ;use function 0 to end execution ; ; utility subroutines for console i/o ; getchr: ;read next console character to a mov cl,coninp call bdos ret ; putchr: ;write character from a to consoleov cl,writer mov dx,offset fcb call bdos or al,al ;error code zero? jz ready ;for another record jmps error ;message if not ; ; ; ; end of write command, process read ; ; notw: ; not a write command, reaffset equ 0000h bdos_ofst equ 0B06h ;BDOS entry point csts equ 0DAh ;i8251 status port cdata equ 0D8h ; " data port lsts equ 41h ;2651 No. 0 on BLC8538 status port ldata equ 40h ; " " " " " data port blc_reset equ 60h ;reset s; Track buffering variables cpm_disk rb 1 cpm_track rw 1 cpm_sec rw 1 cur_disk rb 1 cur_track rw 1 cur_sec rw 1 dma_offset rw 1 dma_segment rw 1 dma_longword equ dword ptr dma_offset bdos_wr_code rb 1 wr_flag rb 1 ; System Memory Sck for lower case jnb transl ret transl: and al,5fH ;translate to upper case ret ; ; ; Template for Page 0 of Data Group ; Contains default FCB and DMA buffer ; dseg org 05ch fcb rb 33 ;default file control block ranrec rw 1 ; mov cl,conout mov dl,al ;character to send call bdos ;send character ret ; crlf: ;send carriage return line feed mov al,cr ;carriage return call putchr mov al,lf ;line feed call putchrd record? cmp al,'R' jz ranread jmps error ;skip if not ; ; read random record ranread: mov cl,readr mov dx,offset fcb call bdos or al,al ;return code 00? jz readok jmps error ; ; read welected USARTS on BLC8538 ;********************************************* ;* * ;* Intel iSBC 204 Disk Controller Ports * ;* * ;********************************egment Table segtable db 2 ;2 segments dw tpa_seg ;1st seg starts after BIOS dw tpa_len ;and extends to 08000 dw 1000h ;second is 10000 - dw 1000h ;1FFFF (64k) ; include singles.lib ;read in disk definitions ; DISKS 2 dpbase equ $ random record position ranovf rb 1 ;high order (overflow) byte buff rb 128 ;default DMA buffer ; ; string data area for console messages badver db 'sorry, you need cp/m version 2$' nospace db 'no directory space$' ret ; print: ;print the buffer addressed by dx until $ push dx call crlf pop dx ;new line mov cl,pstring call bdos ;print the string ret ; readcom: ;read the next commandas successful, write to console readok: call crlf ;new line mov cx,128 ;max 128 characters mov si,offset buff ;next to get wloop: lods al ;next character and al,07fh ;mask parity jnz wloop1 jmp ready ;for another command if 00 wloop1:     ************* base204 equ 0a0h ;SBC204 assigned address fdc_com equ base204+0 ;8271 FDC out command fdc_stat equ base204+0 ;8271 in status fdc_parm equ base204+1 ;8271 out parameter fdc_rslt equ base204+1 ;8271 in result fdc_rst equ base204+2 ********************************* ;* * ;* Disk Input/Output Routines * ;* * ;********************************************* SELDSK: ;select disk givenfor TBE mov al,cl out cdata,al ;Transmitter Buffer Empty ret ;then return data LISTOUT: ;list device output call LISTST jz LISTOUT ;wait for printer not busy mov al,cl out ldata,al ;send char to TI 810 ret LISTST: ;poll list stav al,4Eh out ldata+2,al ;set usart 0 in async 8 bit mode mov al,3Eh out ldata+2,al ;set usart 0 to 9600 baud mov al,37h out ldata+3,al ;enable Tx/Rx, and set up RTS,DTR mov bx,offset signon call pmsg ;print signon message call clear_flagsselect disk for next rd/write jmp SETTRK ;set track for next rd/write jmp SETSEC ;set sector for next rd/write jmp SETDMA ;set offset for user buff (DMA) jmp READ ;read a 128 byte sector jmp WRITE ;write a 128 byte sector jmp LISTST ;re;8271 out reset dmac_adr equ base204+4 ;8257 DMA base address out dmac_cont equ base204+5 ;8257 out control dmac_scan equ base204+6 ;8257 out scan control dmac_sadr equ base204+7 ;8257 out scan address dmac_mode equ base204+8 ;8257 out mode dmac_stat by register CL mov cpm_disk,cl ; save the selected drive mov bx,0000h cmp cl,2 ;this BIOS only supports 2 disks jnb return ;return w/ 0000 in BX if bad drive ;now, we need disk parameter address mov ch,0 mov bx,cx ;BX = word(CL) mov cltus in al,lsts and al,81h ;look at both TxRDY and DTR cmp al,81h jnz zero_ret ;either false, printer is busy or al,255 ;both true, LPT is ready ret PUNCH: ;not implemented in this configuration READER: mov al,1ah ret ;return EOF for  ; initialize track buffering mov cl,0 ;default to dr A: on coldstart jmp ccp ;jump to cold start entry of CCP WBOOT: jmp ccp+6 ;direct entry to CCP at command level int_trap: cli ;block interrupts mov ax,cs mov ds,ax ;get our data seturn list status jmp SECTRAN ;xlate logical->physical sector jmp SETDMAB ;set seg base for buff (DMA) jmp GETSEGT ;return offset of Mem Desc Table jmp GETIOBF ;return I/O map byte (IOBYTE) jmp SETIOBF ;set I/O map byte (IOBYTE) ;pr equ base204+8 ;8257 in status fdc_sel equ base204+9 ;FDC select port (not used) fdc_segment equ base204+10 ;segment address register reset_204 equ base204+15 ;reset entire interface max_retries equ 10 ;max retries on disk i/o ;before perm e,4 shl bx,cl ;multiply drive code * 16 add bx,offset dp_base ;create offset from Disk Parameter Base return: ret home: test wr_flag,1 ! jnz home1 ; if the buffer is clean, mov cur_disk,-1 ; insure we read the directory by invalidating ; now GETIOBF: mov al,0 ;TTY: for consistency ret ;IOBYTE not implemented SETIOBF: ret ;iobyte not implemented zero_ret: and al,0 ret ;return zero in AL and flags ; Routine to get and echo a console character ; and shift it to uppergment mov bx,offset int_trp call pmsg hlt ;hardstop ;********************************************* ;* * ;* CP/M Character I/O Interface Routines * ;* Console is Usart (i8251a) on iSBC 86/12 * int signon message and initialize hardware INIT: mov ax,cs ;we entered with a JMPF so use mov ds,ax ; CS: as the initial value of DS:, mov es,ax ; and ES: mov ss,ax ; use local stack during initialization mov sp,offset stkbase cld ;set forwarrror cr equ 0dh ;carriage return lf equ 0ah ;line feed cseg org ccpoffset ccp: org bios_code ;********************************************* ;* * ;* BIOS Jump Vector for Individual Routines * ; the track buffer home1: mov cx,0 ; home is a settrk zero settrk: mov cpm_track,cx ; save track number for next operation ret setsec: mov cpm_sec,cx ; save sector number for next operation ret setdma: mov dma_offset,cx ; save DM case uconecho: call CONIN ;get a console character push ax mov cl,al ;save and call CONOUT pop ax ;echo to console cmp al,'a' jb uret ;less than 'a' is ok cmp al,'z' ja uret ;greater than 'z' is ok sub al,'a'-'A' ;else shift to c;* at ports D8/DA * ;* * ;********************************************* CONST: ;console status in al,csts and al,2 jz const_ret or al,255 ;return non-zero if RDA const_ret:d direction push ds ;save the DS register mov ax,0 mov ds,ax mov es,ax ;set ES and DS to zero ;setup interrupt 0 to address trap routine mov int0_offset,offset int_trap mov int0_segment,CS mov di,4 mov si,0 ;then propagate mov cx,510 * * ;********************************************* jmp INIT ;Enter from BOOT ROM or LOADER jmp WBOOT ;Arrive here from BDOS call 0 jmp CONST ;return console keyboard status jmp CONIN ;return console keA offset address ret setdmab: mov dma_segment,cx ; save DMA segment address ret sectran: mov bx,cx ; Put logical sector into dest. reg. test dx,dx ; see if table address is zero jz sectran_exit ; yeah, logical = physical add bx,dx ; eaps uret: ret ; utility subroutine to print messages pmsg: mov al,[BX] ;get next char from message test al,al jz return ;if zero return mov CL,AL call CONOUT ;print it inc BX jmps pmsg ;next character and loop ;************ ret ;Receiver Data Available CONIN: ;console input call const jz CONIN ;wait for RDA in al,cdata and al,7fh ;read data and remove parity bit ret CONOUT: ;console output in al,csts and al,1 ;get console status jz CONOUT ;wait ;trap vector to rep movs ax,ax ;all 256 interrupts ;BDOS offset to proper interrupt mov bdos_offset,bdos_ofst pop ds ;restore the DS register ; Initialize the BLC 8538 printer port mov al,0FFh out blc_reset,al ;reset all usarts on 8538 moyboard char jmp CONOUT ;write char to console device jmp LISTOUT ;write character to list device jmp PUNCH ;write character to punch device jmp READER ;return char from reader device jmp HOME ;move to trk 00 on cur sel drive jmp SELDSK ;     lse, we need to fetch the mov bl,[BX] ; actual sector number from the table mov bh,0 ; zero high byte for good luck sectran_exit: ret GETSEGT: ;return address of physical memory table mov bx,offset seg_table ret read: call trac last_com,BX ;save command address for retries outer_retry: ;allow some retrying mov rtry_cnt,max_retries retry: mov BX,last_com call send_com ;transmit command to i8271 ; check status poll mov BX,last_com mov al,1[bx] ;get command op codealid -1. push es ; save extra segment mov cur_disk,-1 ; insure initial pre-read sub ax,ax ; make a zero mov wr_flag,al ; clear the dirty buffer flag mov di,offset sec_flags ; point to the update flag list mov bx,ds ! mov es,bx ; ESsector number if (host_fsn ne 0) sub ax,host_fsn ; correct if we start with sector one endif mov cl,7 ; log2(128) shl ax,cl ; sector times 128 gives offset mov cx,64 ! cld ; move 64 words forward ret flush_buffer: test wr_fl may leave dirty records ; in the buffer call flush_buffer ; we have a directory write, need to ; flush the buffer to insure the ; disks integrity write_return: sub ax,ax ; never return BAD SECTOR code ret track_setup: ; k_setup push es ; save the extra segment register mov si,offset track_buffer ; source segment is systems DS: add si,ax ; gives the offset into the buffer les di,dma_longword ; point ES:DI at the users sector rep movsw ; doit pop es ; r mov cx,0800h ;mask if it will be "int req" cmp al,2ch jb exec_poll ;ok if it is an interrupt type mov cx,8080h ;else we use "not command busy" and al,0fh cmp al,0ch ;unless there isn't mov al,0 ja exec_exit ; any result ;poll for bits <- DS mov cx,host_spt ! cld ; set length and direction rep stosb ; zero the sector update flags mov cur_dma_seg,ds ; get our segment address pop es ; recover extra segment ret track_READ: mov io_com,4 ; read track takes 4 byte cag,1 ; see if we have anything to write jz no_flush ; no, skip scanning for dirty sectors mov bx,host_fsn ; start at first host sector mov cx,host_spt ; for host_spt sectors... next_sect: test sec_flags-host_fsn[BX],1 ; see if this sector has common code for setting up reads and writes mov al,cpm_disk ; see if selected disk is cmp al,cur_disk ; the same as last time jne wrong_track ; no, we have wrong track mov ax,cpm_track ; see if desired track is same as cmp ax,cur_track ;estore the extra segment sub ax,ax ; make a zero return code ret write: push cx ; save the write mode from the BDOS call track_setup push ax ; save buffer offset push ds ; save the data segment push es ; save the extra segment  in CH, exec_poll: ; toggled with bits in CL in al,fdc_stat ;read status and al,ch xor al,cl ; isolate what we want to poll jz exec_poll ;and loop until it is done ;Operation complete, in al,fdc_rslt ; see if result code indicates errommand mov io_com+1,13h ; special read track command jmps r_w_common sector_WRITE: mov io_com,3 ; write sector takes 3 byte command mov io_com+1,0ah ; basic write sector command r_w_common: cmp cur_disk,1 ! jne not_first_b ; see if drive been changed jz not_updated ; no, leave it alone mov sec_flags-host_fsn[BX],0 ; zero the flag for next time push bx ; save the registers push cx mov cur_sec,bx ; save host sector number mov ax,host_sectsiz if (host_fsn ne 0) sub bx,h the track in the buffer je correct_track ; same drive and track, we don't need to read ; Desired operation is on a different track then is in our buffer, ; So it will be nessecary to read in the desired track. First, we ; must check to see if anymov bx,ds ! mov es,bx ; destination is our data segment mov di,offset track_buffer ; destination is in track buffer add di,ax ; plus appropriate offset lds si,dma_longword ; source is users DMA address rep movsw ; move that sector pop es or and al,1eh jz exec_exit ;no error, then exit ;some type of error occurred . . . cmp al,10h je dr_nrdy ;was it a not ready drive ? ;no, dr_rdy: ; then we just retry read or write push ax ; save error code call restore ; after physicB test b_first_flag,-1 ! jz not_first_b ; and first reference to B call restore ; then restore drive B mov b_first_flag,0 ; and clear flag not_first_b: mov bx,offset io_com ;point to command string mov ax,cur_sec ; put sector in mov sect,ost_fsn endif mul bx ; make track buffer offset add ax,offset track_buffer ; make direct pointer mov cur_dma_adr,ax ; save for write routine call sector_write pop cx pop bx not_updated: inc bx loop next_sect no_flush: mov wr_flag, sectors of the current buffer are dirty. wrong_track: call flush_buffer ; write any old records, if nessecary mov ax,cpm_track ; get desired track number mov cur_track,ax ; make in new track mov al,cpm_disk ; get desired disk number mov; restore the extra segment pop ds ; and the data segment registers pop ax ; recover buffer offset mov cx,host_sectsiz ; setup to divide by host sector size sub dx,dx ; extend ax to 32 bits div cx ; find out which host sector we changed ally homing this disk pop ax ; recover error code dec rtry_cnt jnz retry ; up to 10 times ; retries do not recover from the ; hard error mov ah,0 mov bx,ax ;make error code 16 bits mov bx,errtbl[BX] call pmsg ;print appropriate messagal ; iopb as 8 bits mov ax,cur_track ; same with mov trk,al ; track . . ; fall into execute and return execute: ;execute command string. ;[BX] points to length, ; followed by Command byte, ; followed by length-1 parameter bytes mov0 ; clear the dirty buffer flag ret clear_flags: ; Clear all variables associated with the track buffer, ; so next operation will have to read a track. ; This is involves clearing all write flags and setting ; the old drive code to the inv cur_disk,al ; make it current drive mov cur_dma_adr,offset track_buffer ; point dma offset at track buffer mov cur_sec,host_fsn ; starting from first sector call track_read ; load the track correct_track: mov ax,cpm_sec ; get the cp/m  mov bx,ax ; put into index [BX] mov sec_flags[BX],1 ; set the update flag for that sector mov wr_flag,1 ; also set the dirty buffer flag pop cx ; recover BDOS write code cmp cl,1 ; is this a directory update ? jne write_return ; no, we     e in al,cdata ;flush usart receiver buffer call uconecho ;read upper case console character cmp al,'C' je wboot_l ;cancel cmp al,'R' je outer_retry ;retry 10 more times cmp al,'I' je z_ret ;ignore error or al,255 ;set code for permanent e; Track buffering variables cpm_disk rb 1 cpm_track rw 1 cpm_sec rw 1 cur_disk rb 1 cur_track rw 1 cur_sec rw 1 dma_offset rw 1 dma_segment rw 1 dma_longword equ dword ptr dma_offset bdos_wr_code rb 1 wr_flag rb 1 ; System Memory S_trp db cr,lf,'Interrupt Trap Halt',cr,lf,0 errtbl dw er0,er1,er2,er3 dw er4,er5,er6,er7 dw er8,er9,erA,erB dw erC,erD,erE,erF er0 db cr,lf,'Error Code 0 :',0 er1 db cr,lf,'Error Code 1 :',0 er2 db cr,lf,'Error Code 2 :',0 er3 db cradr out dmac_adr,al ;send low byte of DMA mov al,ah out dmac_adr,al ;send high byte mov ax,cur_dma_seg out fdc_segment,al ;send low byte of segment address mov al,ah out fdc_segment,al ;then high segment address dma_exit: mov cl,[BX]cute jz restore_exit ;home drive and return if OK mov bx,offset bad_hom ;else print call pmsg ;"Home Error" jmps restore ;and retry restore_exit: ret ;********************************************* ;* rror exec_exit: ret dr_nrdy: ;here to wait for drive ready call test_ready jnz retry ;if it's ready now we are done call test_ready jnz retry ;if not ready twice in row, mov bx,offset nrdymsg call pmsg ;"Drive Not Ready" nrdy01: call egment Table segtable db 2 ;2 segments dw tpa_seg ;1st seg starts after BIOS dw tpa_len ;and extends to 08000 dw 1000h ;second is 10000 - dw 1000h ;1FFFF (64k) ; include singles.lib ;read in disk definitions ; DISKS 2 dpbase equ $ ,lf,'Error Code 3 :',0 er4 db cr,lf,'Clock Error :',0 er5 db cr,lf,'Late DMA :',0 er6 db cr,lf,'ID CRC Error :',0 er7 db cr,lf,'Data CRC Error :',0 er8 db cr,lf,'Drive Not Ready :',0 er9 db cr,lf,'Write Protect :',0 erA db cr,lf,'Track ;get count inc BX mov al, 80h cmp cur_disk,0 jne sel1 ;drive 1 if not zero mov al, 40h ;else drive is 0 sel1: mov sel_mask,al ; save select mask or al,[BX] ;merge command and drive code out fdc_com,al ;send command byte parm_loop: dec  * ;* Send_com sends a command and parameters * ;* to the i8271: BX addresses parameters. * ;* The DMA controller is also initialized * ;* if this is a read or write * ;* * ;**********test_ready jz nrdy01 ;now loop until drive ready jmps retry ;then go retry without decrement zret: and al,0 ret ;return with no error code wboot_l: ;can't make it w/ a short leap jmp WBOOT ;********************************************* ;Base of Disk Parameter Blocks dpe0 dw xlt0,0000h ;Translate Table dw 0000h,0000h ;Scratch Area dw dirbuf,dpb0 ;Dir Buff, Parm Block dw csv0,alv0 ;Check, Alloc Vectors dpe1 dw xlt1,0000h ;Translate Table dw 0000h,0000h ;Scratch Area dw dirbuf,d 00 Not Found :',0 erB db cr,lf,'Write Fault :',0 erC db cr,lf,'Sector Not Found :',0 erD db cr,lf,'Error Code D :',0 erE db cr,lf,'Error Code E :',0 erF db cr,lf,'Error Code F :',0 nrdymsg equ er8 b_first_flag db -1 rtry_cnt db 0 cl jz parm_exit ;no (more) parameters, return inc BX ;point to (next) parameter parm_poll: in al,fdc_stat test al,20h ;test "parameter register full" bit jnz parm_poll ;idle until parm reg not full mov al,[BX] out fdc_parm,al ;send next par*********************************** send_com: in al,fdc_stat test al,80h ;insure command not busy jnz send_com ;loop until ready ;see if we have to initialize for a DMA operation mov al,1[bx] ;get command byte cmp al,13h jne write_mayb ;* * ;* The i8271 requires a read status command * ;* to reset a drive-not-ready after the * ;* drive becomes ready * ;* * ;**************pb1 ;Dir Buff, Parm Block dw csv1,alv1 ;Check, Alloc Vectors ; DISKDEF 0,1,26,6,1024,243,64,64,2 ; ; 1944: 128 Byte Record Capacity ; 243: Kilobyte Drive Capacity ; 64: 32 Byte Directory Entries ; 64: Checked Directory Entries ; ;disk error retry counter last_com dw 0 ;address of last command string cur_dma_adr dw 0 ;dma offset stored here cur_dma_seg dw 0 ;dma segment stored here sel_mask db 40h ;select mask, 40h or 80h ; Various command strings for i8271 io_com dbameter jmps parm_loop ;go see if there are more parameters parm_exit: ret ;********************************************* ;* * ;* Data Areas * ;* e ;if not a read it could be write mov cl,40h jmps init_dma ;is a read command, go set DMA write_maybe: cmp al,0ah jne dma_exit ;leave DMA alone if not read or write mov cl,80h ;we have write, not read init_dma: ;we have a read or write oper******************************* test_ready: mov dh, 40h ;proper mask if dr 1 test sel_mask,80h jnz nrdy2 mov dh, 04h ;mask for dr 0 status bit nrdy2: mov bx,offset rds_com call send_com dr_poll: in al,fdc_stat ;get status word test 128: Records / Extent ; 8: Records / Block ; 26: Sectors / Track ; 2: Reserved Tracks ; 6: Sector Skew Factor ; dpb0 equ offset $ ;Disk Parameter Block dw 26 ;Sectors Per Track db 3 ;Block Shift db 7 ;Block Mask db 0 ;Ex 3 ;length (changed to 4 to read a track) rd_wr db 0 ;read/write function code trk db 0 ;track # sect db 0 ;sector # sec_len db 26 ;transfer 26 sectors on a track read hom_com db 2,29h,0 ;home drive command rds_com db 1,2ch ;read status command  * ;********************************************* data_offset equ offset $ dseg org data_offset ;contiguous with code segment signon db cr,lf,cr,lf db ' CP/M-86, 1 Feb 82 ',cr,lf,0 bad_hom db cr,lf,'Home Error',cr,lf,0 intation, setup DMA controller ; (CL contains proper direction bit) mov al,04h out dmac_mode,al ;enable dmac mov al,00 out dmac_cont,al ;send first byte to control port mov al,cl out dmac_cont,al ;load direction register mov ax,cur_dma_ al,80h jnz dr_poll ;wait for not command busy in al,fdc_rslt ;get "special result" test al,dh ;look at bit for this drive ret ;return status of ready restore: ;move selected disk to home position (Track 0) mov bx,offset hom_com call exe     tnt Mask dw 242 ;Disk Size - 1 dw 63 ;Directory Max db 192 ;Alloc0 db 0 ;Alloc1 dw 16 ;Check Size dw 2 ;Offset xlt0 equ offset $ ;Translate Table db 1,7,13,19 db 25,5,11,17 db 23,3,9,15 db 21,2,8,14 db 20,26,6,12 db 18,24,4,1 al,cur_disk ; the same as last time jne wrong_track ; no, we have wrong track mov ax,cpm_track ; see if desired track is same as cmp ax,cur_track ; the track in the buffer je correct_track ; same drive and track, we don't need to read ;  write: push cx ; save the write mode from the BDOS call setup push ax ; save buffer offset push ds ; save the data segment push es ; save the extra segment mov bx,ds ! mov es,bx ; destination is our data segment mov di,offset track old_disk: mov bl,cpm_disk ! mov bh,0 mov dl,4 ! shl bx,dl ; times 16 add bx,offset dpbase ; gives offset from DPBASE ret ; back to BDOS setdma: mov dma_offset,cx ; save DMA offset address ret setdma_seg: mov dma_segment,cx ; save; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; * * ; * CP/M-86 Accelerator -- Track Buffering Routines * ; * * ; * This module, when installed in a CBIOS, causes * ; * CP/M-86 to perform disk input output on a * ; * tra0 db 16,22 als0 equ (243+7)/8 ;Allocation Vector Size css0 equ 16 ;Check Vector Size ; DISKDEF 1,0 ; ; Disk 1 is the same as Disk 0 ; dpb1 equ dpb0 ;Equivalent Parameters als1 equ als0 ;Same Allocation Vector Size css1 equ css0 ;SameDesired operation is on a different track then is in our buffer, ; So it will be nessecary to read in the desired track. First, we ; must check to see if any sectors of the current buffer are dirty. wrong_track: call flush_buffer ; write any old r_buffer ; destination is in track buffer add di,ax ; plus appropriate offset lds si,dma_longword ; source is users DMA address rep movsw ; move that sector pop es ; restore the extra segment pop ds ; and the data segment registers pop  DMA segment address ret home: test wr_flag,1 ! jnz home1 ; if the buffer is clean, mov cur_disk,-1 ; insure we read the directory by invalidating ; the track buffer home1: mov cx,0 ; home is a settrk zero settrk: mov cpm_track,cx ; sck by track basis, rather than sector by * ; * sector. * ; * * ; * This speeds diskette access up, often by a * ; * factor of four or more times. * ; * * ; * The actual disk sectors must be a integral * ; * multiple of 128 bytes,  Checksum Vector Size xlt1 equ xlt0 ;Same Translate Table ; ENDEF ; ; Uninitialized Scratch Memory Follows: ; dirbuf rs 128 ;Directory Buffer alv0 rs als0 ;Alloc Vector csv0 rs css0 ;Check Vector alv1 rs als1 ;Alloc Vector csv1 rs csecords, if nessecary mov ax,cpm_track ; get desired track number mov cur_track,ax ; make in new track mov al,cpm_disk ; get desired disk number mov cur_disk,al ; make it current drive mov cur_dma,offset track_buffer ; point dma offset at trax ; recover buffer offset mov cx,host_sectsiz ; setup to divide by host sector size sub dx,dx ; extend ax to 32 bits div cx ; find out which host sector we changed mov bx,ax ; put into index [BX] mov sec_flags[BX],1 ; set the update flave track number for next operation ret setsec: mov cpm_sec,cx ; save sector number for next operation ret sectran: mov bx,cx ; Put logical sector into dest. reg. test dx,dx ; see if table address is zero jz sectran_exit ; yeah, logical =but do not need to be * ; * a power of two multiple unlike the deblocking * ; * algorithms supplied with CP/M-86. * ; * * ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; The following three equates must be set to correspond ts1 ;Check Vector sec_flags rb host_spt track_buffer rb host_spt*host_sectsiz loc_stk rw 32 ;local stack for initialization stkbase equ offset $ lastoff equ offset $ tpa_seg equ ((lastoff+07FFh)/0400h)*40h ; round off to 1K boundaryack buffer mov cur_sec,host_fsn ; starting from first sector call track_read ; load the track correct_track: mov ax,cpm_sec ; get the cp/m sector number if (host_fsn ne 0) sub ax,host_fsn ; correct if we start with sector one endif ag for that sector mov wr_flag,1 ; also set the dirty buffer flag pop cx ; recover BDOS write code cmp cl,1 ; is this a directory update ? jne return ; no, we may leave dirty records ; in the buffer call flush_buffer ; we have a dir physical add bx,dx ; else, we need to fetch the mov bl,[BX] ; actual sector number from the table mov bh,0 ; zero high byte for good luck sectran_exit: ret read: call setup push es ; save the extra segment register mov si,offset tro the ; actual disk utilized. host_sectsiz equ 1024 ; bytes per actual (physical) disk sector host_spt equ 8 ; actual sectors per track host_fsn equ 1 ; starting sector number (only 0 or 1 allowed) init: call clear_flags ; Initialize track bu tpa_len equ 0800h - tpa_seg db 0 ;fill last address for GENCMD ;********************************************* ;* * ;* Dummy Data Section for Interrupt Vectors * ;* mov dl,7 ; log2(128) shl ax,dl ; sector times 128 gives offset mov cx,64 ! cld ; move 64 words forward ret flush_buffer: test wr_flag,1 ; see if we have anything to write jz no_flush ; no, skip scanning for dirty sectors mov bx,0 ectory write, need to ; flush the buffer to insure the ; disks integrity return: mov ax,0 ; never return BAD SECTOR code ret setup: ; common code for setting up reads and writes mov al,cpm_disk ; see if selected disk is cmpack_buffer ; source segment is systems DS: add si,ax ; gives the offset into the buffer les di,dma_longword ; point ES:DI at the users sector rep movsw ; doit pop es ; restore the extra segment sub ax,ax ; make a zero return code ret ffering . . . jmp CCP_entry seldsk: mov cpm_disk,cl ; save the selected drive test dl,1 ; check logged-in bit jnz old_disk ; not first time selected if nz ; here if CP/M is about to login to the drive being ; selected.  * ;********************************************* dseg 0 ;absolute low memory org 0 ;(interrupt vectors) int0_offset rw 1 int0_segment rw 1 ; pad to system call vector org bdos_int * 4 bdos_offset rw 1 bdos_segment rw 1 END       ; start at host sector 0 mov cx,host_spt ; for host_spt sectors... next_sect: test sec_flags[BX],1 ; see if this sector has been changed jz not_updated ; no, leave it alone mov sec_flags[BX],0 ; zero the flag for next time push bx ; save "*$"*'"*-"*"* "@: X:?2:2K}K̀̓I[S*R°: ˜*|˜*)"*#"S.!5>X#*^#VzKCK͉"!># # >longword dma_offset rw 1 dma_segment rw 1 cur_disk rb 1 cur_sec rw 1 cur_track rw 1 cur_dma rw 1 bdos_wr_code rb 1 ; 1 indicates a directory write wr_flag rb 1 ; bit 0 on indicates we have a dirty buffer sec_flags rb host_spt ; bit 0 of ethe registers push cx mov cur_sec,bx ; save host sector number mov ax,host_sectsiz mul bx ; make track buffer offset add ax,offset track_buffer ; make direct pointer mov cur_dma,ax ; save for write routine call sector_write pop cx pop! ͌~.#  7 C7E0OÌ!@w#:_:O͆|r" gÒ :O͆DISKCHK version 1.4b $checksumming on drive $ $Error---invalid drive chosen $checksumm@THIS IS A HEADER*# w# w# wc ͭ!8 G͙(O#:#* ͣ((O (\(6(O 8.(&0@ #?##w^#U#ͭ!R(ach byte on indicates ; corresponding host sector has been ; updated and needs writing. track_buffer rb host_sectsiz * host_spt  bx not_updated: inc bx loop next_sect no_flush: mov wr_flag,0 ; clear the dirty buffer flag ret clear_flags: ; Clear all variables associated with the track buffer, ; so next operation will have to read a track. ; This is involves cleing on currently logged in drive $ Disk suitable for use. $ BAD DISK---DO NOT USE. CheckSum is: $Error--Selected disk does not exist $DONE $Error---Disk too full to contain checksum $aring all write flags and setting ; the old drive code to the invalid -1. mov cur_disk,-1 ; insure initial pre-read sub ax,ax ; make a zero mov wr_flag,al ; clear the dirty buffer flag mov di,offset sec_flags ; point to the update flagBAD DISK---DO NOT USE. CheckSum is: $Error--Selected disk does not exist $DONE $Error---Disk too full to contain checksum $ list mov bx,ds ! mov es,bx ; ES <- DS mov cx,host_spt ! cld ; set length and direction rep stosb ; zero the sector update flags ret track_read: ; read an entire track from the drive "cur_disk", ; the track "cur_track" into "track_buff @GTHIS IS A HEADER*# w# w# wc ͭ!8 G͙(O#:#* ͣ((O (\(6(O 8.(&0 @G #?##w^#U#ͭ!R(er". ret sector_write: ; write a physical sector to disk "cur_disk", ; track "cur_track", sector "cur_sec" from ; the buffer at DS:"cur_dma". ret dseg cpm_disk rb 1 cpm_track rw 1 cpm_sec rw 1 dma_longword rd 1 org dma_     67 t@|:t9 <w<w[9: FF<.uFC365 [ C??u ÿD (tKuÊ< uÌK5 .> u. 0 >,. 0 Q$ТX$9 .> u0 AsA+>&_9 .0*!ͷ "!*!"!!"!*!+!!:!*!!ͷ >!DUg>!!7!RD!$!dgx*!*!DMr*!*!"!!!:!ڗ!!!+s#r*!+"!>!·*!#"!"!*!"!*!"!D*!  A*!!ͷ "!*!͹ >!*!#"!*!Drating system. If you have d MS-DOS there will be a disk labeled INSTALL III (MS/DOS) d with your release materials. d d Do you have the INSTALL III diskette (y/n) => q 11 20 l 11 d d MS-DOS will be installed on yslate Table$als$equ$Allocation Vector Size$css$equ$Check Vector Size$ds$rs$Uninitialized Scratch Memory Follows:$begdat$equ$Start of Scratch Area$dirbuf$Directory Buffer$alv$als$Alloc Vector$csv$css$Check Vector$enddat$equ$End of Scratch Area$datsiz$equ$-b> ;t׋65 tu+: tE>( t5H ؋⹐ \ 7 < t tS[C?. t: u̻( ? u!Ê< t'C,0< suűrrruÀ? uCuûK؊': t$Ȼ9 :t: t Ȼ9 :uà9 MrS*!+ /A*!!ͷ BKr3S!!r+s+p+q*!*!ͷ "!>!T*!*!"!*!"!:!!r+s+p+q*!DM*! A*!DM*! *!DMS!!r+s+p+q;͹O*!DM͈:͹O*!DMDi;͹OKDiqxA |S:G$:͹our master ; set up for ms-dos disk change l 12 w syslib !!҈:!A 2!Ð:!02!*!MU!!q:!On:!On!!p+q*!|O͘*!}O͘!!q:!0OU!!q*!&!dͷ K*!&! ͷ ! ͷ Minstall mstest$ syslib t  > t /.  u(? u ?CuR)uuȊȰ Es u p t bZR$PuzQYAj:e^:[V$< uXP<u $< t 5ŀ s u$XI*! COPYRIGHT (C) 1980, DIGITAL RESEARCH d d d Remove the INSTALL II diskette and replace it with d the INSTALL IV (OFFLINE UTILITIES) diskette. f 98 ; force $$$.sub write and change disks l 98 s @ d d HIT RETURN WHEN THE DISKS HAVE BEEN CHANGED => r ; bye*!&! ͷ M!!p+q:@$ң*!DM̀,U!!6:&!!p:!=O!& ~2! b#U*!M͘i*!MU!!45:U*&M:&–,U*&DMͳHU:&ң̀!!q!!:&¸ͭ>>!!p+q!!6:!<2!O*! ~2!>!!:&>:& !& Disk Parameter Blocks$dpe$xlt$Translate Table$Scratch Area$dirbuf,$dpb$Dir Buff, Parm Block$csv$alv$Check, Alloc Vectors$range $equ$ diskparm$delimit$missing$numeric$duplic $Alloc $no disk$Disk $ is the same as Disk $dpb$Equivalent Parameters$als$Sameu`Z. u!d  tC?YtC5 >( tg'HuL. uJ>( tCetr S#[uCJ<tS[uuE. :u: PtU'765 <=t<_u5F65 u+X:  t:ň/u/'͎ñ3б QYð Q[ uCS[';20 빱:뵱 뱊бñG'tù رԺ's ñ' V O͕*!DM͕*!DM!͕>!,! !!6:! *!DM2͕i*!E ͭ:G$$͹>!!0!!6H:&C*&!!sH!!6:!>!!He/ͭA:<$ҁ Æ$͹S!!6:!!!* :!=_ :G$Ҳ:͹x:!=_ UHSxHUH/Sx<:!=_D HS Allocation Vector Size$css$Same Checksum Vector Size$xlt$Same Translate Table$too few$Disk $ is CP/M 1.4 Double Density Compatible$65536$128 Byte Record Capacity$Kilobyte Drive Capacity$32 Byte Directory Entries$Checked Directory Entries$Records / Extentt')8o G( uW{ '>( u: tȢ9 1 t̠9 >0 t30'u=@t+؎%: S'[7G\'! t tqt9 L 2tVP 3. zC/5 ñ uñ ñ3 uð 9  u< sW; _Ê<u< tFC QYtC<*u?FtFø'S: 65  IA MS*!DMbͧ*! Nt*! N*!!!s!!:!R!!5:!l*!& Nv*!M*!+DMͧ*!+DMͧ*!|O*!}O*!!ͷ BKͧ*!DMͧ*! A:!\S S!"!"!*!DM*!; 5IMSTEST Version 1.2 10may84 (msh) ; l 00 d d DO NOT CHANGE DISKETTES UNTIL THE PROGRAM ASKS YOU TO d "HIT RETURN WHEN THE DISKS HAVE BEEN CHANGED" d d ; test if ms-dos to be loaded d d MS-DOS is an optional ope$Records / Block$Sectors / Track$Reserved Tracks$Sector Skew Factor$dpb$equ$Disk Parameter Block$Sectors Per Track$Block Shift$Block Mask$Extnt Mask$1.4 Compatible$Disk Size - 1$Directory Max$Alloc0$Alloc1$Check Size$Offset$xlt$equ$No Translate Table$Tran      < tN tſ&E.&E.*. ?t.0 (, : uhCMD$$$ SUB$ $t""" #t &$t&!u #tut 2"#4# #w#:#r$u t y]# #$(###t2#ڠ#ù"2CQ$Y á"$$Ë""#B" ڊs "t"*"#Ë$ Ë$";rBR+ӋZñ##sQO#"Yt :t s_È3$ $2G)D(F+Fu +D+DF+F؉DYZ]ËGDEQRVSh/[:s Eu^ZY UVQ'#:*#s ;s F;w;FsްY^] U'#:*#s +Fu] U'#:*#s F+u\UUðTTÃ|tDD"">"u """, "<t<u"|uD< u ÃpuS5[T"ÃË%sá$##"$"$"ʱ3 ">$tuMT"p "Q?t$GOQp  =_.:;<>,DIRSUSERREN TYPEERA DIR NO FILEALL (Y/N)?FILE EXISTSMEMOR؈؉C>$tÈ #>#uE> #u>6#>"3@### #Ê6""C:u###:rP$X<u>#u_Y$ uȢ#H#Q$!ڊ$PC$Ȋ$XC ۳ui ڈ ڊ*u ڊ " "$$~û$C:uû$Ë#$C$ds䠦$$QY# u&QYLр"ڊR$Y QȈYQZuR>#tQSQCS t ";r[CYϋ"Cˋ"C#""25] û" u%l rPX< t< t < t<t< à" uKD$t8<u:1<t2">#u $$t>#u H&"à" uQYQYQ>$tY"<t< s t<u< uÊNs P^Y@ u "$u u€YY Ў"$0"&E "8t 0D&ED|tD&&e&>"u &e& ƒv"$$"$"$#<t >#wh##$%$ڊOW[3ۊ؁%$Y NOT AVAILABLEREAD ERROR CANNOT CLOSE NON-SYSTEM FILE(S) EXIST SYSTEM FILE(S) EXIST z*.$P.&'#.#PX.#.&'#XÐ$##$$>$#GEE)#u >*#tsunD9GrGSyuX:*#sMHuD+9GrG-Su2u-kAu :*#suCn*#G2$ËG"""uσtlutc<uutGE&c%  ' ! !!!!!(!.!4!=!F!X!a!g!m!s!!!! WvD" $J zȎ؏$t r$$&$>$tȎм$$$&_tUWV%#^_]%#$&$$$ω$#3$'#[urg" "#$\\$#Gt g#`#$$Ȣ#<s$##$$$À>#`u$"u"3ۉ""$$N{>$t ##<#u#>#t#K$#`$Iau6$6#NT =t4Ok- t IRQ)sYZ;"sBQRsZY+[Z u̻ñ R$Y[ $u kt UtPSڋ$ RZ ڊڊ/[X:tr[Y&<u <u؎@:s,[&/ ؎bDb?t uLD0? u 0!c_Ë$Î$$ð% %% %"˻"'QYÊ$tP"""ډ #"$"""## t8u GDGD3)#### 2*#Ê)##9t!sUG;u E+GE@ܰËG;EtsE+GEEEEEE)##À>)#t#uñ$'#>)#st QD+Gu  D##!S)r 6ٷ. #<uU###jS$A##YPQ'#(#26$6$#>$$YXQ!Q$YPQ(#2$#>$>$YXñ"##ȎS"[PS\+\E+E;v[X++" "<tft[>#`u$G $u#~Z$$$??t??t=$$$$)"&$$J"" nl"$à##t u u:uGڋ;u3BCBCu¹هً:rهي #$6$$"U$t$ڱ2Cu ڈy2 # t 3"Ë# # t߻"o$###6"Rȋ6" #JY #T@"#*#Ë$ـ>#tًȵ#Ë# Ê"###"" ؉#Ë$ ú$#ڊ#""##<uYQVW*#Ȣ*#*t2ɋ_^YRW3ҵ:*#sD;rЊt _ZRW:*#sD+Gtr;sЊ߰t _ZËGSFF[UQ;r F;FrY] à*#*#+#URQ;uF;FuYQ<u"|t>D"|DtD"Q8RZY>$t1Q6Y"9DsD8\|t Ts [T t)"7T>$t5H;"wױ7="+,>###;uE# "8t ðÀ>"u "ډ"ð|t.|t\;\v+\     X"#À>#t$$>#`uO# t ##>'#uSꡛ$#cuL 6$$ t* : 2ȎVWF*77 u >)u[_^Ã?u[_^Sw˷㋟*[ع$Q0=9vGY؎<uäMË6Gt  SP+؋_ Ƙ؋t@[þ?þBڊF FFÈ)á*È)SػM[þQzþfsþ`lþeþr^þoWþcPþTIþ0BþW;þZ4þ]-þl&s`þi?? @Bdos Err On : $Bad Sector$Select$File R/O$V)e)t)))) DMS-86 CP/M BIOS Version 1.3g D***`* i/o error loc: num: cmd: typ: vol: par: trk: sec: *** waiting at location: *** *** i/o error at loP{-8>ci.B$&LM/12Es~D]7~J@3cation: command: Sorry, call not implemented. ''' Do you wish to (R)etry, (A)bort or (I)gnore ? Digital Microsystems, Inc. CP/M-86 Version 1.1  T++T-T,+T/T.+(Ȏ؎R+м< )))ھ-m$gC+IN+CC+)!){C!)D|&E1&E3&Eg&E ڌȎм<1&G* 0 )þu t tÊ ÊttQ,Y) )^u!u<uðÉ)É )ûG+û*Êt S[Cò     !!H + :!6 *&! ~* /*&! 6 :!!&!/HW + :!!!!!&:!H~ + :! &$!œ !"& &$!² !"& &$! !"&  &$! !"& @&$! !"& + :!slate Table$als$equ$Allocation Vector Size$css$equ$Check Vector Size$ds$rs$Uninitialized Scratch Memory Follows:$begdat$equ$Start of Scratch Area$dirbuf$Directory Buffer$alv$als$Alloc Vector$csv$css$Check Vector$enddat$equ$End of Scratch Area$datsiz$equ$-bMrS*!+ /A*!!ͷ BKr3S!!r+s+p+q*!*!ͷ "!>!T*!*!"!*!"!:!!r+s+p+q*!DM*! A*!DM*! *!DMS!!r+s+p+q;͹O*!DM͈:͹O*!DMDi;͹OKDiqxA |S:G$:͹! ͌~.#  7 C7E0OÌ!@w#:_:O͆|r" gÒ :O͆DISKCHK version 1.4b $checksumming on drive $ $Error---invalid drive chosen $checksummi~#fos#r! ^#V##^#V! s#rH&`i^#V!9~#fo͆,@'`i^#V!9~#fo+&! ^#Vsr('!9^#V))PY" 2* 2ut! ^#V* 2##> !&:!>!,!H& + ; *!) &!; + :!´ >&ͪ >!] + ñ !"!*&"!*!+|ڱ *!) !!!+s#r*!}ҝ /!"!î !!! "!i :!>&ͪ >!!&!HH + *!&!) *&s#rͭ:&egdat$Size of Scratch Area$Marks End of Module$program$No Stmt$ maclib$ macpar$ disks$ diskdef$extra $!!q> !!҈:!A 2!Ð:!02!*!MU!!q:!On:!On!!p+q*!|O͘*!}O͘!!q:!0OU!!q*!&!dͷ K*!&! ͷ ! ͷ M1!͒0102821100654321@ ? @End-File$offset $bad val$dpbase$equ$Base ofing on currently logged in drive $ Disk suitable for use. $ BAD DISK---DO NOT USE. CheckSum is: $Error--Selected disk does not exist $DONE $Error---Disk too full to contain checksum $s#r`i^#V!9~#foV,* 2s#r!9^#V`is#r" 2!! s#r`i`i* 2+ʇ'!3)DM+c'!!`is#r!! s#r`i͋'* 2DM:& +! 9^#V!##~#ʮ'!* 2DMÿ'! ^#VBK`i͕,'! ^#V͕,(! ^#V`i͆,(PY͕,(!  !!4\  :!‡ *!! ~- /:0$_ i;͹O*!M\*!M\Diddd:6dÖ :! Җ O/!!!#"!:0$ i:! ;͹OW*!M\]D*!#M> _*! "!;͹O>!!7! *!DM*!&! ͷ M!!p+q:@$ң*!DM̀,U!!6:&!!p:!=O!& ~2! b#U*!M͘i*!MU!!45:U*&M:&–,U*&DMͳHU:&ң̀!!q!!:&¸ͭ>>!!p+q!!6:!<2!O*! ~2!>!!:&>:& !& Disk Parameter Blocks$dpe$xlt$Translate Table$Scratch Area$dirbuf,$dpb$Dir Buff, Parm Block$csv$alv$Check, Alloc Vectors$range $equ$ diskparm$delimit$missing$numeric$duplic $Alloc $no disk$Disk $ is the same as Disk $dpb$Equivalent Parameters$als$SameBAD DISK---DO NOT USE. CheckSum is: $Error--Selected disk does not exist $DONE $Error---Disk too full to contain checksum $^#V͔,(ö'! ^#Vsr! s#r`i" 2!H+>(H+*.DM*.og!9N#F#^#V f( j([(kb6#> 6 #=q(>6#=z( ')ڛ(0_zWÅ(/¥(è( : >( A)[(@(a){)`w# .()()w#({o|g )͈ :͹OD!"!>!!7!= *!M!! +s#r*!*! DM͕*!DM͕*!DM͕:!u !"!à !!:!Ҋ ! "!Ð !@"!*!#M!! +s#r*!DM͕*!#M> O͕*!DM͕*!DM!͕>!,! !!6:! *!DM2͕i*!E ͭ:G$$͹>!!0!!6H:&C*&!!sH!!6:!>!!He/ͭA:<$ҁ Æ$͹S!!6:!!!* :!=_ :G$Ҳ:͹x:!=_ UHSxHUH/Sx<:!=_D HS Allocation Vector Size$css$Same Checksum Vector Size$xlt$Same Translate Table$too few$Disk $ is CP/M 1.4 Double Density Compatible$65536$128 Byte Record Capacity$Kilobyte Drive Capacity$32 Byte Directory Entries$Checked Directory Entries$Records / Extentm}}}}.. . . . . . ....mT m "" 00000 @@@@@@@@@@@@@@@ @@@@@@@ @@@@@ @@@@  ̀8Ò22!V!zt~ <#AiHi _ A2Y Ò Y"*NFC*~2Fnf"#>)2+"#|!5:4 N`: *"~* IA MS*!DMbͧ*! Nt*! N*!!!s!!:!R!!5:!l*!& Nv*!M*!+DMͧ*!+DMͧ*!|O*!}O*!!ͷ BKͧ*!DMͧ*! A:!\S S!"!"!*!DM*!x:!=_] U:!=_a eS!!4‘z/!!6> !!R *!&! 6!!47 !!6!&6,:! H *!&!) >w#6,ͤڗ / :& :&,H*!&! w *!& ~ / :& / *!&) &!!*!&) +$Records / Block$Sectors / Track$Reserved Tracks$Sector Skew Factor$dpb$equ$Disk Parameter Block$Sectors Per Track$Block Shift$Block Mask$Extnt Mask$1.4 Compatible$Disk Size - 1$Directory Max$Alloc0$Alloc1$Check Size$Offset$xlt$equ$No Translate Table$Tran0*!ͷ "!*!"!!"!*!+!!:!*!!ͷ >!DUg>!!7!RD!$!dgx*!*!DMr*!*!"!!!:!ڗ!!!+s#r*!+"!>!·*!#"!"!*!"!*!"!D*!  A*!!ͷ "!*!͹ >!*!#"!*!D"*$"*'"*-"*"* "@: X:?2:2K}K̀̓I[S*R°: ˜*|˜*)"*#"S.!5>X#*^#VzKCK͉"!># # >     0*!ͷ "!*!"!!"!*!+!!:!*!!ͷ >!DUg>!!7!RD!$!dgx*!*!DMr*!*!"!!!:!ڗ!!!+s#r*!+"!>!·*!#"!"!*!"!*!"!D*!  A*!!ͷ "!*!͹ >!*!#"!*!D(:&'͍2&':& %M/)K:&0O> /-:&AO>/H:&AO>/-LH!"&}2&2&!&6DISKSENDEFMACLIBDISKDEFvwxyz{Ϳ:&:&H:&:&;:& Ϳ:&2&>!&*&&&&*&60!&6:&P&̀>!&P!&6:&=!&P*&&`& NU!&41!&6!&6#602&&͹:& :&H:& š :& ½ :&<ʺ ç:& :&:&a:&_2&*&M02&r:&<2&!&6+6!2 $: $02 $* $M͹!$q:$O:$O!$p+q*$|O*$}O!$p+q*$DM1h͹!$q*$&dr!$p+q*$'r!$p+q*$'r:&:&ҭ!&6:&»;͹O!$6:$<2$!&:$=O!`& N͹D!$p+q*$~$ *$NMrS*!+ /A*!!ͷ BKr3S!!r+s+p+q*!*!ͷ "!>!T*!*!"!*!"!:!!r+s+p+q*!DM*! A*!DM*! *!DMS!!r+s+p+q;͹O*!DM͈:͹O*!DMDi;͹OKDiqxA |S:G$:͹) ^#V" '~2 '*&& ~2&>! 'z ! '5:&#w>! '~=O!& * '&* ' H\ ! '5, : 'e !&4:& '͝ +s#r !&6!'q!':&#wҙ !&6: '_og_ogDM!>))덑o|g =¾ DM!>)) = _{ozg~ ^#V)&6!&q:&!&D*&&.$ 6!&4):m$€!&6>!&ڀ*&&m ~A2&y*&&.$ 6!&4Q:e ˜.e - \͒:M$̀$U>p!&6#6!&6!|6!"^&!&6>!&*&&& 6 *&&& 6 :&<*$#"$!$s+p+q*$DM*$&dr!$p+qO*$DM!!$p+q* $DM/O!#$p+q:! gOY;͹*"$DMDAA!%$p+qx*$$DMr!&$q*&$M\!*$r+s+p+q*'$DM͆*)$DMS!-$r+s+q*+$M͘*,$DMS DISKDEF Table Generator, Vers 1.0ͽ\S!!6>!!ڄ*!&! ~}*! :G$A:͹ͽ*! S*! :G$j:͹ͽ*! S!!4A SA S:G$EAHA!!6>!!*!&! 6!!4!!6:&ڑ Error(s)$ ^#V|g}o !_{ozgi`N#Fogo&og_{_z#W2&!&6$̀V:& (!&6N#6o&̀!&p+q:&=!&6&͹*&DM̀!&:&2&:&=2&O>s U]?U!&q:&ʌ*&M͹!&:&ڧV:&Ҥ>Í*&&`& ~2':&<2&:'!'6!&6+~!&6!&6:&K:& :&H͍2 $DEF No Input File Present, Command Form is: GENDEF x $ Where x.DEF Holds Disk Definitions With Optional Parameters : C: Create Diskdef Comment O: Generate Offset-Relative Labels Z: Z80, 8080, or 8085 (else 8086, 8088!&6ͭ͞/:& ʋ7ͻ,</Ë*!M!u ^#VͭDͭM}ͭV}]2 }ͭ}<Q`l:& ʋf/c$ LIBno ".LIB" directory space$".LIB" disk full$cannot close ".LIB"$dw$db$.!! 9^#V^!7X!â `i#DM! 9~#fo#s#r`iv^3! 9^#V^! K^0!!.: ͤY!DM! 9^#Vn`i#DM! 9~#fo#s#r#! 9^#V^wYu}ʩ! 9^#V^!.K^ʩ`iv^ʩSû! 9~#fo#s#r! 9^#V~ߤ! 9^#V^!.&;L!&6;-#!&6;:&'6!&6+6;!&6:&H':&ʆ*&&& :&w <`iwO>҆:&{!&6=/!&6:&2'͍2&:&¶:&$ª!&6óX/ҳ):&:&$!&69/:&O:&QH!'6:&H!) x.LIB is Created Upon Completion. $Premature End-of-File$Length $Convert$Quote $!H$q*H$& U U!J$p+q*I$ !L$p+qe*K$DMp!O$p+q*N$2M$!Q$p+q*P$2M$!S$p+q*R$!U$p+q*T$!W$p+q*V$!Y$p+q*X$2M$![$p+\ -.! -:l(:l2!!͸!:M$B!!6!"$}2!!&6!$!+!$s{l!"$!$6:$!$ڲ*$" DM !ʞ*$"$:$<2$w!"$!$q:$ !!6:$ :!2!:$ :!<2!$$!W*$"K^ߤì! 9~#fo#s#r+^#+s{K!DM$`i#DM! 9~#fo#s#r#! 9^#V^wYu}K`iv^K !uͤY!9~#p!-!9s#r{!5!9s#r!"_!9^#V!9:!9~#ʷ!9^#V!(ZLZ!g:!:!9~#!9^#V!'6>!'!&6G:'B+:&=2&!'6G:'DB:&=2&!'6 G!'6 !"&!'6:&!':'=O!& ~2'A}:'A 2'Å:'02':'2'O:'ژ!&6*&"'*'&"&:'*')"':'2'*'*&"&!&6æ:'<2'R:&E/!&6):&q*Z$!]$p+q*\$!&p+qe*&DM̀:&:>*^&#"^&!N͠!"^&^&$!Җ*^&^$ DM \ʉ*^&^$ 6!"^&Ó*^&"^&T!"^&͠*^&^$ ~2&µ!&6:&!&p+q!&6:&=2&*&&*&~2& !&60:&<*&&*&wO>9 * :$w*$#"$!!6*$},:!<2!͹W!ͥ:M$C ͹ ͹ ͹,͹!$q:$0O͹;͹D! $r+s+q+q+p+q> $,!*$* $ͷ ! ͷ ! $s~!$>! $7!H2$: $/ ͹* $M[* $! ͷ " $Ä! $q> ! $: $ A      +! ! !!!I ! 9! 9^#V!3,J!9^#V##^#V"\2P!,"\2! 9^#V!3,u!9^#V!^#V"^2{!,"^2!!!b2͒*lʤ*\2!I !!*,)h3s#r:2o&+!h3*^2͌!Install Utility -- version %d.%d%c%c Can`i~#fo#s#r+s!+ +! -DM`i~I`i DM-͆,F!%!`is#r! s#r! s#r`i +!9N#F! ^~$ʙ!! s#r`i! s#r!%!9s#rz!! s#r!`in+s!9^#V! s#r!.:s# y*"04*-"249^#V +! 9N#F!9^#V!9~#foy+!9#͔,m!9^#V`i#DM+^ͯ+j!2!9^#V +! 9^#V!9~#fo+s#r!3,!9^#VDM,`i#+s`i +Æ!u`i+! 9~#fo+!! 9^#V!9s#r .+ʫ #+^!*+[ !9~#fo##s#r++^#V!9s#r#+^ë !!9s#rw #+^s.#^!+ʫ !9^#V! y+!9s#ri !!9s#rl+ #+^!!9s#r h+ #+^ !^#V*y+!!X9^#V*n+.!!T!^9^#VI  +! 9^#VY +! 9^#V~#ʋ! 9~#fo##s#r++^#VI _z +!!!9͒*!9^#V!9s#r!9~#fo##s#r!9^#V~#ö!9^#V$!!9^#VF! 9s#rz not open input file %s  +͗: 2o&Ó!2ú!2!2ú!2;ú!2ͻú!2ú!2!2!2ú!2Dú0úú_,c_d.fIijq9rsTw*b3| +! 9^#V!I %s +!! 9!9^- +!!D/!ͮ*!:o&+D/s!"/!D/DM!"/*/2,`i^! +x`i^! +ʀ`i#DM\`i~`i^!>+ʞ!ò`i^!<+ʇ!`i#DM^! +`i^! +ò`i`i#DM~`i^! +`i^! +! +! - +! 9N#Fz,v!+c`i~#fo+s#r!`in+s!_,` `<v +! 9N#F! ^#V`i^#V͆,;! ^!+ʯ!!`in+s`i~#c! ^#V! ^#V! ^p,#!9s#r3 ! !9s#r3 !!9s#r3 !!9s#r!9^#V!9!9^#V!9^#V͒!9!9s#r!9^#V!9~#fos#r !9~#fo##s#r++^#V!9s#ry*!9s#r !9~#fo##s#r++^#V!9!9s#rs _,c d( o sy u x !9!9~#f!!9~#fo++s#r##!9~#fo,ʨ!9^#V^#V!!9g !$!9y*!9#s!9^#V^#Vy*!9s! 9^#V!!!9!9!,ʥ! 9^#V3!! 9^#V?+!!w %s +! !9^#V!9^#V͒*!9^#V! 9s#r!9^#V+! 9^#V;:!,;:!"9^#V;:_,Y +*f3"d3!!9^#V!,)͗{!!,! 2ͬ){]*b3|ʐ*d3!I *** Error: EOF while processing line %d  +!!9^#V^!b2s +!!9^#V^!b2s +! 9^#V`i#DM+s?|0!͹>!+ʄ!!)!*!!*!! ;(! `i*/#"/+)/s#r`i#DM~`i^! +`i^! +!`i#DM+sÛO!/*/!Can't open file for| !!`in+s!! ^#V`is#r! s#r`i~#fo#s#r+^!+ +!-!9^#Vl +! 9N#F!9^#V`i +ʦ! ͯ+ʦ!ͯ +!9N#F! ^#V`i^#V͆,! 9^#V!+ͬ! 9^#V`i~#fo#s#r+soV,!9s#r!9^#V!9~#fo3,/!9^#V!9s#r!9~#ʉK!9~#fo#s#r!9~#fo+s#r#!9~#fo3,ʉ!9^#V`i++ʆ!<!!9s#ræ!9~#fo#s#r!9^#V~!9^#V!9~#fo2,!9~#fo#s#r+^`i++!×!9^#V!9~! 9s#r! 9~# ! 9s! 9^ !!9~#fo#s#r+s!9^#V^! 9~#fo+s#r#|x !T! T!TG ! 9^#V!9~#fo, !T! T!T! !9~#fo+s#rs! 9~#fo#s#r ! 9^!9~#fo#s#r+s! 9~#fo+s#r _,^!b2^!+#!9^#V;/!9^#V; +/!! 9K +!! ;(!! ;( +!*\2F"`2|ʑ!"b3!!r +*f3#"f3*`2!P! 2v¿!"b3*b3|+! 2!9s#r!9~#fo#s#r!9^#V^! ,!9^#V redirection: $ +*.+!DM`i 2,<`i#DM+?"! 9~#_!;(+_!c$A:$$$.SUB +!".4! +!con:CON:lst:LST:prn:PRN:pun:PUN:rdr:RDR: +!9^#V!!9^#V +!-!! 9s#r ! !+ +! -DM`i-͔,2`i DM3 +! 9N#F!`i~ʟ! ^!+n!ͬ! ^?+! ^!+ʟ! ^#V͋'!! s +! 9N#F!".! ^!+!! ^!+?! ^#V`i^#VV,! ^#V#fos#r!9~#_%!9~#fo#s#r!9~#fo+s#r#!9~#fo3,_! `i++\!Æ`i++w!!9~#fo#s#r !9^#V!",",! 9~2,G+V+^+6",+N+V+^!,w#ºy/w#!,>^)|g,{ % % G {  !9s! ,H !9^! ,H !9^#V^ +!9!9^#V!T;  +! 9^#V".!9!9^#V! ; DM!*.s`i +! 9^#V*.#".+s!+& +!9N#F!9^#V!!9s#r!9^#V!9s#r#+^zʉ^!^+!! 9^#Vs!! 9^#Vs*b3 +*`23!"b3 +!!9^#Vy*#>%*,)h3s#rzʔ! 9^#V*,)h3^#V)*,#",!I *** Internal error: out of memory  +! !9^#V!9^#V͒*!|Y!9s!9^! +9~#fo#s#r! 9^#V! 2,/nfm+9!".4!!.DMI`iDM`i~#j!9^#V`i^#V͡)jA! ^#V!9^#V!+#!9s#r!9^#V!+ʯnu}¯!".4!!9^#V!+nu}!".4!! ^#Vsrnunu!}ut!9^#V! ^m +?!`in+s!`is#r! s#r!!9^#V!+v!`in+s!`is#r! s#r!`i~#‡c! ^#V!+!!9! ^m +!9^#V! ^#V`is#r! ^#V! ^#V! s#r!`in+s!9^#Vs+=Z!6~*,+",w!,#!*,4+6-0123456789ABCDEF +DM|Z!!9^#V!9^#Vr +!9^#V3!,DMÔ`iDMx£!".4!!9^#V͡)ʷÌ! ^#V!9^#V+!!9^#V!s!!9^#V!s!%+b!!9s!!9s#r! !9s#r!'!9s#rn&-+a !!9s#r#+^0+ʆ !0!9s#r#+^*+ !9~#fo##s#r++^#V!9s#r#+^ !!9s#r#+^!s.#^!+ !9^#V! y+!9^! +! 9^#V^!9~#V!9~#fo+s#r!9^*!9~#fo#s#r+s +! 9~#fo+s#r#|ʁ!T`^ +!9^#VY!P! 9*!9s#r!9^#VZ*!T!9^#VI Ô!9^#V +!P! 9!X9s#r!X9     !9^#V!9^#Vnf+! 9!2,6!mut!! 9^#V +! 9^#V!2,e! 9^#V! 3,o!".4!! 9^#V)))-DM! ^#V! ^#V+! 9s#r!! s! s! s`is!m! s#r! 9^#V +!/DM`i'DM`i0͔,`i%~!".4!i#DM+JG! 9~#0H!V^0H!4HSEA:$$$.SUB͐Y!"-!͐Y!con:CON:lst:LST:prn:PRN:pun:PUN:rdr:RDR:͐Y!9^#V!!9^#VͫH͐Y!_!! 9s#rH! 9~#fo#s#r! 9^#V! b^Inf>H(^ IH+ o&DM!99`i+|DM!99!"+`i~# x=+!9W+.~#^+!k+v+|DM!>))҉+ =+}{_ʸ+|+|7g}ož+{_ʸ+)³+}{_ʸ+|g}o+|g}o|/g}/o|g}o|g}o|,,},|9^#V###ͻ+#!9s#r* 2|/&!2"2" 2nfDMH&`i! ^#VBK! ^#V`i,ʤ&! ^#V`i^#V))PY+ʤ&! ^#V^#V`i~#fos#r! ^#V##^#V! s#rH&`i^#V!9~#fo͆,@'`i^#V!9~#fo+&! ^#Vsr('!9^#V))PY" 2* 2ut! ^#V* 2##9^#VBK!9^#V!"!͕)!!9^#V`iV,ͻ+! 9s#rzʗ!! 9^#V!9^#V`i͠$!9s#rzʗ!͕)! 9^#V!9~#foV,ͫ+PYDM|”!!`i! 9^#V!ͫ+PYDM`i!9~#fo͔,!!9^#V`iV,!9^#V`i!!͕)`i͕)!9^#V +! 9N#F#!9^#VO(!9s#r!+)!".4!!9^#V!+Dm)!9s#r!9^#V|)!9^#V!+j!;(!;(+ʰ!9^#V!+ʠ!;(+ʭ!".4͕)!!9^#V!++!".4͕)!!!! s#r!# s!$ s!9^#V!& s`i!9^#V!1͈0102821100654321 COPYRIGHT (C) 1982, DIGITAL RESEARCH [], ERROR: $, LOAD ADDRESS $DISK WRITE$DISK READ$INSUFFICIENT MEMORY TO CREATE CMD FILE $,!},|,!}|*,}|?>o&zo&|D,}|>o&|o&}/o|/g#}}o|gBK^#Vz,#yy,###g,#xt,#~#fo}|>?o&}|>o&l INSTALL.TXT$$$.SUB99rr+ww+a a+ xs#r`i^#V!9~#foV,* 2s#r!9^#V`is#r" 2!! s#r`i`i* 2+ʇ'!3)DM+c'!!`is#r!! s#r`i͋'* 2DM:& +! 9^#V!##~#ʮ'!* 2DMÿ'! ^#VBK`i͕,'! ^#V͕,(! ^#V`i͆,(PY͕,(! 2,"!!9^#V!$ ^!!9^#Vͮ*!";(".4|G"!!$ ^!9~#fo+!$ s{y"`i!~#fo#s#r! +!9N#F!9^#V+#|"`i^! +ʼ"! !;(`i#DM+^!;(Ô"!9^#V +!9N#F!9^#V+#|#`s#r!9^#V!+#!% s!I!9^#V!s#r!9^#V!+B"#͕)! +! 9N#F#!;(!!% s! +! 9^#V)))-DM!9^#V!9^#V! ^#V`i^)a.^#V+ +!DM!9^#Vn&&|)$~#n$&!V,DM!9~#fo͕,!LOAD ADDRESS $ERROR ADDRESS $BYTES READ:$RECORDS WRITTEN $ABSCANNOT OPEN SOURCE$CMDNO MORE DIRECTORY SPACE$CANNOT CLOSE FILE$!9"!!"!"!6#6!6!"\!;<:?Re\́\ͱ\<:x+44???????????}}}mmmmmmm^#V͔,(ö'! ^#Vsr! s#r`i" 2!H+>(H+*.DM*.og!9N#F#^#V f( j([(kb6#> 6 #=q(>6#=z( ')ڛ(0_zWÅ(/¥(è( : >( A)[(@(a){)`w# .()()w#({o|g )i#DM+^!9^#V;("!9^#V +! 9N#F!#;(`i!~#R#!!$ s!`i!~#fo+s#r#o#!!͕,ʢ#+^!,ʟ##â#u#!$ s!+#`i!~#fo#s#r!!$ s! +!"2 +! 9N#F*2PY, $!!9^#VBK!9^#V#͕)!!9^#V`iV,ͻ+! 9s#rzʋ! 9^#V!9^#V`i͘$!9s#rzʋ͕)! 9^#V!9~#foV,ͫ+PY! 9^#V!ͫ+PYDM`i!9~#fo͔,!9^#V`iV,!9^#V`i͕)`i͕)!9^#V +! 9N#F#!!9 U*  \O:*m{:222222222222222222!q*& k k!q> !ҡ:A Okê:0Ok!q:O͆:O͆!p+q*|Oͫ*}Oͫ!p+q* !p+q{*DM!m}}}}.. . . . . . ....mT m "" 00000 @@@@@@@@@@@@@@@ @@@@@@@ @@@@@ @@@@ )w#(&jz!|*) >?a{ 0:1)7!9^#V*-W)*04}|W)*-"-|!=!9}_|#W"04H+ o&H+ 2r.:. _H+ :r._!9õ)!9F+N+V+^+~+ngx)))# þ)og!9V+^+~+ngw)#)|!9F+N+V+ ^#V*2,z$!!;(!!;(".4+<$*.4+^$!".4!!!͒*!"2!*.4|j$!`i"2!! ^#V"2! +! 9^#V)))-^H+!å$H+"*.!".*.$*.!4$#4*.+".}¦$$$o&".4*. +!9!6^#V!9^#V!$ ^!ͮ*!$ ^!9~#fo+!$ s{P`i!~#fo#s#r! +:0!}20!}21}20!0! ;(! !;(:1o&+ʧ!}20!:i.o:0o#}20&0#s!"2:0o&DM!9~#fo3,!9^#VBK!9^#V*20ͮ*`i*p+q*DM*DM!p+q*!p+q*2!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q*!s+p+q+p+q:=2 ** w*#"G!ͫH(^UG!G!͌X!ͨX!G!ͨX!! V! GäG`i*b#"b+)'bs#r`i#DM~ʤG`i^! (^’G`i^! (^ʡG!`i#DM+säGlG F!'b*b͞!GCan't open file for redirection: $͐Y* `͏Y!DM`i b^ H`^+~+ngx*w*# *|!91*!9F+N+V+^+~+ng対C*#;*xT*wT*# C*w|!9^#V#n~v*q*#d*!|!9~#foʎ*#Å*}!9^#V#N#F#nxʬ*s# á*! 9F+N+V+^+~+ng**}** +!9~a*{* o&!9~A+[9^#VO(DM|)!9!;(DM͕)`i+:%!".4!! +! 9^#V!9~#foy+DM%|y%!!9^#V͒* +!9N#F! ^#V+))!9s#r͋'!9^#V%|%PY,%!9^#V!9~#fo͕,%!9^#V%!9^#Vͮ* +!2"2`i:0oV,}20`i +!9N#F!4 #!9~#fo2,i ! 9^#V;(`i#DM+s!+i -  +! 9^#V)))-DM!9^#V!9^#V! ^#V! ^)j.^#V+ +!DM!9^#Vn&&|)$~"!n$&!V,DM!9~#fo͕,!!      *#"{!6:}3*& Nk!4?k{*#":fX* ~> !q: k> :a}:_2:?O\2:  ?O\2Ë!s+q*&`:R!6>!*& :>!4½>! q: 0O> : 0: AO>iDM `i~ !`iY*H_DM`i~U !!9^#V`iͫXU `i`DM# `i~d !`iY!*B_DM`i^zʣ ̓^ʣ `iDM#x Y!*H_DM! ^z ̓^ `i`DM#ø Y!, !9s#r!9^# ;͟!9^#V^!̓^E! ;! ;! ;!R ;! ;ͤ This program will not work on a running Master. You can run SYSLIB if you boot from a floppy. You are running this program on a network station. SYSLIB will read and write the table_"_|!=!9}_|#W"ȍY o&Y 2`:a _Y :`_!9hX!9F+N+V+^+~+ngxʆX†XʆX# qXog!9V+^+~+ngwʤX#ÙX|!9üX!9F+N+V+^+~+ng対X#XxXwX# Xw|!9^#V#n~YX#X!͹ _H͡))))͹ _"!<6>!<D ͹ *<&= w*+"!<4 !<6>!<ڮ c :<2<I î !6!6>!ڠ :<!O! *&= ʙ !6!4m :« ñ U >:<<_!{!Cq!D6:C!D ͹ 2*+"!D4 !" ~2́* >: A !" ?2͸S*M28 J* ))))*& " ?2* *#"ip* ~!"!͋Õ*"v͑2 ¸* DM: * 6!"Å!":!"""}2627!62|o&VPY!9^#V!! 9^#VͫX( !!THIS IS A HEADERyY!!! 9s#r!x! 9s!! 9s!9! 9s#r! 9͊ !9^!9s!9^!ͮ^ʛ !!DMí !9n+s!9~ !PY]DMã `i_ `i_ !| ! ;!C ;!{ s from the LOCAL hard disk attached to this station. If you intended to work on the SHARED hard disk attached to the Master, you should abort this program now.Y!!"DM`i!  ;!2 ;͟!A ;͟!_ ;͟^EImpossible ProductZSBC-3 ComputersDSC-4DMS-1280DMS-3/C "Killer Bee"DMS-86 and DMS-5086DMS-5016DMS-816PC AdapterDMS-16BDMS-808Apricot AdapterHex AdapterDMS-200Y!a!!! ;!9ͥ&! ;l= "{!>_͊ !D_͊ !J_~2  *#" ́: } + :FT :]: HN M y :Fd !6y :F t !6y !6 !I6>!Iھ ͸Ҡ *I&K 6 ÷ *I&K :w?O\2!I4‚ !F6!J6!H6:F !J= !H6+6>!G/#' *G&K *F""2>!&*&$) >w#6!4 !"!"! 6͹ 2H͹ ͹ _H͡":¹͹ 2*+"!6>}ʹ*+"͹ 2« 2ʨ*& :wò*M !4r: ͹ ͹ _H͡*6& ) q#p*++"!64:­͹ o&"* ;͟`i Error - the size of your Control Area is listed as %dk. SYSLIB only understands sizes of 256k or 512k for the Control Area. Y:͓^ʮ ! 9^#V##^ý ! 9^#V##^#DM! 9^#V###^!9^#V!^#V!9^#V^#V!Ͱ%! 9YSYSLIB7 Sorry, you need that overlay in order to run SYSLIB. Not a Separated Boot System Access Denied. Y!  ;! ;! ;!b ;! ;! ;! ;! ;!^ ;!` ;! ;! ;! ;! ;!! 9̓^v! pDMnl!A!"Õ!M!"Õ!!"Õ!! "Õ!!"Õ!!"Õ^ AE.L^MPNQ V> SYSLIB %d.%d%c-- Maintain the System File Directory Hard disk not operational.SYSLIB1SYSLIB&> *G& !H6$ !G4 :H6 !J6: !F4 :JI !F6:F:]: H ́:AŽ  *F&>+  q#p :M  *F&>+  q#p:F< *F&>+ Hq :X  *F&>+  q#p M i`N#F+"!6*& ~}:<2O>/H7 !5 >}ʭ͹ o&" *&>+  ͹ =2O!  !+  q#p:< *&>+ Hq*++"@: *++" *M 5!6>!g  *&>+  >͈`  *&:͓^ ! 9^#V##^, ! 9^#V##^#DM! 9^#V###^!9^#V!^#V!9^#V^#V!Ͱ%! 9Y!9^#V!͝]!'^!9^#V!͈]!9~#fo^L^Y! ;!! 9 !9^!t^ l Hit RETURN to continue, to abort9^ͯY SYSLIB MAIN MENU A - ADD/REPLACE Add or replace a Control Area Directory file E - ERASE Erase a file from the Control Area Directory M - MODIFY Modify a Control Area file name L - LIST List Contr1SYSLIB2SYSLIB4SYSLIB3SYSLIB6Y!"}!9^#V!9^#V##DMt^ʸ! 9^#V*}! ;*}á! ;ø! ;ø! ;ø!9 ;ø!P ;ø^uj`i SYSLIB: Error #%d in loading overlay %s.OVR: overlay missing or badog_og_{ozgDM!>))덑o|g8 =&DM!>))M =E_{ozg^#V) `_{ozgi`N#Fogo&og_{_z#WCODE DATA EXTRASTACKX1 X2 X3 X4 8080 NZERONHEADCGROUPDGROUPEGROU>+  > !+s#r *&>+  >͈`  *&>+  !N#Fq#p!4+,\͡ʇ %͈ *:7 Y!! Wo!!W!!WY!9^#V! ;!! 9DM! 9^ͯY!9s`i̓^v!9^!Y̓^!9^!N̓^v!9^!Yt^%s (Y/N)? --> Y!pol Area Directory or OS Table V - VERIFY Verify that the Control Area is complete P - PRODUCT Product Table Add/Modify Q - QUIT Leave this program. Enter your choice --> Y*B_DM`i~ !!9^#VͫX `not enough memory to load it!overlay appears corruptedfile is not an overlaycannot find it on the disk.Y! ;!.H Exiting program normally Y! ;!.H Leaving program due to errorY!G!9s#r!9^#V~!F ;!wPSGROUPM*DMW pP *}5 W **Nͫ*#" k {{*DM:k k*4DM,\͡ʃ %!74!"4*4* iڵ m *4"4Î m W2;! w:;*+">f ͹ O͜ *#" p *+"͹ !      Is this correct Y!#9^#V!ͯ^=!#9^#V!t ;!!DMJ`i#DM`iͮ^!u_,A!9s! ̓^!9^!9^`i! 9sxʟ!! ;xʶ!! ;`i+DM`i+DMx!!! ;`i+DMþ`i+DM^zE`i#V!L9~#fo!N9~#fo*_)$!(͖$!J9^#V^#V}2!J9^#V"!L9^#V!L9^#V!X9^#V͍L!L9~#fo_y$!2͖$!T9^#V\J!P9^#V.ovra:Y*fa!^9^#V!*%!9>;!9!9! W!\9^#V! ͈]%!I%DM%!\%DM%!n%DM%!%DM%!%DM%!9~#fos#r! 9^#V!9^#V! s#r!9^#V!9^#V! sY*N_DM!Z#(ͮ^ʎ`i^!ͯ^ʎ`i^!ͮ^ʎ`iDMSY! ;! ; Entry Filename Track Sect Records Load Addr Exc Off ----- -------- ----- ---%c Yg +!9s#r!9^#V!]*B_!"9~#fot^D!"9^#V! ^#V! 9s#r!"9^#V! ^!9s#r!"9^#V!"^#V!9s#r!"9^#V!$^! 9s#rg +!9s#r!9^#V!]*B_!9s#r!9^#V! ^#V!9~#fo^!9s#r!9^#V! ^#V!9^#V! ^!dy a file named in the Control Area.Y!|9^#V!͈]!n9s#r[!!n9~#fo͈]s#r!n9^#V!ͯ^!n9^#VBK|`i#DM`i!|9~#foͮ^`i!n9~#fo^!l9s#rÿ!n9^#V!l9~#fo^s#r!l9^#V!͓^!l9^#V!v9~#fo]!t9~#fo!l9^#V!n9~#fo!t^"!u_,A!9s! ̓^"!2#PYͮ^q!#9~#foͮ^q!9^!#9~#fo#s#r+s+`i *BUG* call to dgets wants too many chars (%d)%c %c%c %cY!"<_":_!!!9iY!9^#V! 9!9s#rz!"<_YZ!^$$$$$! W! .HError %d loading overlay: %s $(File corrupted?)$(File not found)$(Header truncated)$(File isn't an overlay)$(Not enough memory)$Y!9n#s!9^#V!͔^%!9^#V!& ;!:P_%&%!"k_!!}- ------- --------- -------Y! 9^#V1! 9^#V!^#V!9^#V!`Z̈́Z!9^#V! ^#V!9^#V! ^!9^#V! ^#V! ;!9 %4x %2x %4x %8lx %4xY! ;! ; Entry Filename OS Type Support Files Required --- 9~#fo^!9s#r!9^#V!'^!9~#fo!9s#r!9^#V!ͯ^s!9^#V!͓^_!!9s#rm!9^#V!9s#r!9^#V! 9!9^#V!9^#V!Ͱ%! 9!9^#V! 9! 9^#V!9^#V!Ͱ%! 9!9^#V! 9~#fos#r!9^#V!9~#fos#r! 9^#V!ͯ^"!v9~#fo]!t9~#fo!x9~#fo^#V! 9s#r!x9~#fo^#V!9s#r!z9^#V!t^!! 9~#foL^s#r!!9~#foL^s#r!9^#V! 9~#fo_!v9^#V!9ͅY!v9^#VͅY!v9^#V!9ͅYæwEY! 9~#fo+s#r! 9^#V!ͯ^9^#V!9~#foͮ^)!9^#V!9~#foͯ^7!":_YZ! 9^!t^U!"<_YZ! 9_Y! 9YZrZ!DM!":_!9^#V~`i#DM+ͮ^! 9YZ͝Z`Z\rZ!9~#fo#s#r+^!!9s#r!9^#V!t^!":_YZ! 9! 92P_:hao&4&:hao&!& ;!DMC&!'DMC&!o3DMC&^,&X$& &xʔ&!9^#V!9^#V!9^!9^#V!9^`iY! 9~#ʋ&!"k_Ñ&!"k_Ú&!"k_*k_|ʨ&!ë&! *BUG* sector count = %d in hd_xfer *BUG* bad controller type 0x%x in hd_xfer()-- -------- ------- -------------------------------Y! 9^#V!1!" ;! 9^#V^!! 9^#V^!" ;!!" ;!!" ;!!" ;!!" ;!!" ;!!" ;!^!!!!!"!#!i!! # ;!DM!`i#DM`iͮ^! 9~#fo^s#r!9~#fo#s#r!9^#V!ͯ^W!!9~#fo^s#r! 9~#fo#s#r!9^#V!9~#fo^s#r1Y! 9^#V*B_^͖]DMg +`iͮ^¯`iͯ^ʺ!3 ;`i#! 9~#fos#rͮ^!!9^#V!9^#V!Y!:!9^#V1YDM|0! 9^#VBK5`i#DM!E#ͮ^ʌ`i~ʌ`i^!.̓^ʌ`i#DM+^ͯY!9~#fo#s#r+s>Ö#ͮ^ʽ! !9~#fo#s#r+sÏY!l ;!9~#! ;! ;!9~#! ;! ;^#Vu]͝Z`Z[rZÀ! 9`ZY! 9^ͯY! 9s! 9^!0͓^e! 9^!9͔^e! 9^!! 9^!A͓^ʑ! 9^!F͔^ʑ! 9^!!Y!9~#fo+s#r#! 9~#fo#s#r+!9~#fo#s#r+!9^#V!ͯ^!9^#V^!9^#V^̓^!Y'}2ha&Xt^'-͵4Y*DM!iPYDM`i^!ͮ^e'!DM`i^!L^t^a'!X!`i^!|'!!9sÈ'! !9s!!!23WDM!9^`iDM`i^!6L^º'!!XY!9^!9^#VI+!9^!L^(!9^#V*W_̓^ (!9^J"`i)))! 9~#fo~G"`i)))! 9~#fo1`iͮ^G"! # ;!! 9^#V!?~ʶ"!# ;!DMo"`i#DM`iͮ^ʶ"`i)))! 9~#fo~ʳ"`i)))! 9~#fo1!# ;j" ODD OS 0x%x CP/M 2.2 CP/M 86 HiDos MS-DOS 2.0MS-DOS 2.xMͅY! 9^#VN!!]*B_iY **BUG** bad SD entry # %d in sd_delete()Y!9~#o!9^#V*H_^`͖]! 9s#rͧ +!9s#r! 9^#V!ͮ^¼! 9^#V!9~#foͯ^! 9^#V!# ;!9^#V! 9~#fo^`]!9^#V!9^#V!`ͅY!DM `i#DM`iͮ^3! 9^#V`i^! ;! 9^#V!`Z̈́Z! ;! 9^#V!^#V! ;!9~#k!DMÀ!PYDM`iͮ^k`i)))!9~#fo~k`ió#`i###ͮ^:ͮ^:)))!9~#fo~:!#9^#V^!9^#V^^Þ!Y!9^#V!9^#V!9^#V͕t^Y!ͮ^sͯ^ʟ!!9^#Vͯ^ʜ! ;Y! !^!9^#ViY!! 9^#VBK#ͮ^`i^! ͮ^!":_`i^*Y_̓^-(!!ial,!9^#V"W_!9^+"Y_! 9^É(! 9^!* ;!!9^#V!aͅYØ(!!a!9^#VͅY!!ia-Ø(^J(c(8(!!9~#fos#r!9n#s!ͯ^(!!9s!9~#fo#s#r!9~#fo+s#r!9^!9^#VI+!9S-DOS 3.x !9^#V"fa2#Y!!R9s#r*fa! 9X!$! 9X!! 9H!T9s#r!͓^»#!R9~#fo#s#r+|ʜ#! ͖$!$! 9X*fa! 9XQ#! !J9!X9^#V͍L ̓^#!͖$!H9^#V!̓^#!͖$!J9^!!`! 9^#V!`]*H_iY **BUG** bad OS entry # %d in os_delete()Y!! 9s#r!!9s#r!9^#V*B_̓^!9~#fos#r!9^#V! ^#V! 9s#r!9^#V! ^#V!9^#V! ^!9s#r!9^#V!ͯ^!!9~#fo^s#r! 9~#fo#s#rͮ^/)))!9~#fo^! ;! ;ìͮ^h)))!9~#fo~h!  ;x Filename Load Addr. Entry Off. Support Files -------- ---------- ----------- ------------- %c %8lx %4x ͯY`i#DM+s Too long! Re-enter --> Y!DMD`i#DM`iͮ^q! 9~#fo#s#r+^!r ;?%cY!DMÈ`i#DM`iͮ^! 9^#V^! ̓^! 9~#fo#s#r+^! ;Ã%cY! ;! 9^#Vu! ; There is alrea"     ^#V!ͯ^*!9^#V!͈]DM! 9^l)! 9^!* ;`i'^!9^#Vl,{)`i'^!9^#V-{)^8)R)&)`i)!9~#fo^s#r`i'^!9~#fos#r`i)!9ns!9^!ͯ^)!!9n^s!9~#fo#s#rø)!9^!9^#VI+!9s#r!9^#V!9!9^#V!9^#Vi@!9!9s#r!9^#V!9~#fos#r>!9~#fo##s#r++^#V!9s#rPY!9s#r>!9~#fo##s#r++^#V!9!9s#rs>^c}>d=o=sP>u=x=>!9!9~#fo^!9s#r!9^#V!9~#foͯ^?!9^#V!!ͯ9:99!!Y!:9 ;!!:F: HDSK error; buffer = >Q x9\9RV9!!ͅ9!!99ʞ999:9=299!}!999ʺ9º9:9=299^#V#N#Fx29AxY:j_o&DM! 9^#V}2j9s!9~#fo#s#rÂ3:i_44Y*c_|I4!}U"c_|I4!4 ;!!DM!`is!! s:j_o! s!M! sR9}484!! Hard disk i/o error: can't allocate 1k bufferY!!4:!}2R9484!!!ͯ9!Y!!9s!xinitY.//!!/2x/*/!!Y!!9s#rQ/!9~#fo#s#r!9^#V!ͮ^t/a2L^q/!B/!Y!!9s#rÛ/!9~#fo#s#r!9^#V!ͮ^ʾ/a2L^ʻ/!Ì/!YF0!/2\0Y\0!A/2Y!%:L^0!9^#V!ͯ^"*!9^#V!* ;!9~#ʺ*!!ial,!9^#V"W_!9^"Y_! 9^ë*! 9^!,+ ;!!9^#V!iaͅYú*!!ia!9^#VͅY!!ia-ú*^l**Z* *BUG* way = 0x%x in hd_xfer *BUG* way = 0x%x in hd_xfer *BUG* blk 9s#r!9~#`?"?!9~#fo#s#r!9~#fo+s#r#!9~#foͯ^`?!9^#V`iYt^]?!?!!9s#r}?!9~#fo#s#r!9^#V~?!9^#V!9~#foͮ^?!9~#fo#s#r+^`iYt^?!n?!9^#V!9~#fos#r!9~#6@?!9~#fo#s#r!9_`i! }!9^#V#N#F#~#foDM}!9~2.:o&!9~2@:##~o&Y!: ;A!9s!t^x:!: ;!.H!9^ Hit RETURN to continue, to abort: Abnormal end at operator requestY:!9~#fo+s#r!9^#V!ͯ^;! 9~#f}2:h_o&*f_|75!!9^!ͮ^ʗ5!9n#s+}G5!"M5!"R9d5!!9nsÔ5!*c_ͅ98—5:o&@̓^ʔ5!!9ns5!9^!͔^ʲ5!}2i_!9!Y!9^+L^#!9s!9^#V*f_̓^6:h_o&! 9^̓^6:e_o&/Y/!!Q_DM"0#ͮ^E0`i#DM+^!4:0Ya2L^[0L0Ya2L^q0b0Y/a2L^Yr0 ̓^ʣ0!0͟1!!%:DM/!%:`ix_stat_rcvY!9^#V!1 ;!&1 ;!!Q_:!81 ;!!= %d after we've done block xfer in hd_xfer *BUG* way = 0x%x in hd_xferY!9!9^+͈]u]̈́Z!9^#Vu]LZ@\͒Z[rZ!9`ZLZ5]+!!, ;!9`Z̈́Z!9^!9^#V!@, ;! 9!9`ZLZ[̈́]L^}2R_!9`ZLZ[̈́]~#fo+s#r#!9~#foͯ^6@! `iYt^3@!?]@`iYt^N@!!9~#fo#s#r;!9^#V!"q_"s_! 9~2o_G+V+^+6"m_+N+V+^!q_w#‘@y@/w#µ@@!t_>^)|@g,@s+=@Z! A~*m_+"m_w!q_@#o#s#r+^!; ;:%02x Y!9!9^#V!qB͕;Y! 9^#V"ib!9!9^#V!t;͕;DM!*ibs`iY! 9^#V*ib#"ib+s!L^&Y!9N#F!9^#V!!9s#r!9^#V!9s#r#+^z`@%t^9@!!9s!!9s#r! !9:j_o&̓^@6!9^!9^#Vͥ6!9^}2h_!9^#V"f_:j_o}2e_!9^!9^^'^*c_DM! 9^!t^ʎ6!!9^#VͅY!}2i_á6!!9^#VͅY!Y!!9s:i_646!!}2!9^!9^#V|76!!9^!ͮ^U7!9n#: Xebec controller error at %s command buffer: status buffer: Y!2!!!3YI1! 9^#V0ͅ0ʑ1!1͟1!!x_err_rcvYr0!9s! 9^#V!1 ;! 2 ;!!Q_:!9^!2 ;F: Xebec controller fatalL^}2S_!9`ZLZ<[̈́]}2T_ *** illegal sector requested trk = %x, sec = %x; xebec address = %06lxY!9^#V!͝]ʔ,!9^#V!, ;!9^#V!͈]}2U_!2!:U_o&!9^#V3ͅ0,! -j1 *BUG* in just_read length = 0x%x, not mult@*m_ A+6-0123456789ABCDEFY!u_,AY! 9N#F͗A̓^ʓA!L^ÀA`i~#fo+s#r!`in\^s!9A^}A }AYAAY! 9N#F! ^#V`i^#V_XB! ^!L^A!!`inL^s`i~#ÀE! ^#V! ^#Vs#r!'!9s#rn&-t^8>@!Q_R_6Y!2ͅ0ʤ2!2j1do_recalY!2ͅ02!2j1q_readyY! 9^}2Q_/r0̓^2!3͟13/iple of 256just_readY!9^#V!͝]>-!9^#V!- ;!9^#V!͈]}2U_! 2!:U_o&!9^#V?3ͅ0~-!-j1 *BUG* in just_write length = 0x%x, not multiple of 256just_writeY,.-!!! 9![_ͅY!9ͨ.!! 9!!!! ^͍L͔^@B|)B!,B!`in\^s!! ^#V`is#r! s#r`i~#fo#s#r+^!L^Y!_!9^#V͉BY! 9N#F!9^#V`i t^B! Bt^B!BY!9N#F! ^#V`i^#V_C! 9^#V!L^C^2=!9~#fo##s#r++^#V!9s#r#+^Â=!!9s#rN=#+^`#^!L^ʂ=!9^#V! ]!9s#r@=!!9s#rlt^ʵ=#+^!!9s#r=ht^=#+^ì>!!9s#r >! !9s#r >!!9s#r >!9^! 9^͖]]! s!9^! 9^͖]͖]! 9s#r! 9^#V##^+++! 9^#Vͯ^ʡ8!8 ;!!:! 9^#V##^+++:j_o&!8 ;F:! 9^#V! s Mapping error in xlate_dms_cmd: (Max phys track on volume %x is %x)Y!0cmd_hard_5!9^#V#F##NPAr0} ;3g.3!3}!9^#V#F##NPAr0}k3g^3Q3}Y43!Ñ3!9~#fo+s#r!9^#V!ͯ^4!9^#V!9^!9^#V!9^͹5!93!!!9~#fos#r!9n#s!ͯ^4!!;'! 9!9ͨ.!!! 9ͅY!Yl2/!9s{}.r0̓^W.!.͟1/!}2Q_0ͅ0}.! !. ;/C.!9^dms15_upWaiting for hard disk %cY! 2/!DM.`i#DM`i_.! 9~#fo#s#r+^!4:.ͅ0/!/j1#     ! 9^#V`i~#fo#s#r+s!L^Y!u_DM`i__OC`i DMPC/CY! 9N#F!`i~ʼC! ^!L^ʋC!C! ^\J\^! ^!L^ʼC! ^#VT!! sY! 9N#F!$C"p`! ^!L^C!! ^!L^\Dw#W&jz!|*X >?a{ 0:0X7!9^#V*_VX*}|VX*_"_|!=!9}_|#W"Z o&Z 2`:_a _Z :`_!9ôX!9F+N+V+^+~+ngxXXX# ýXog!9V+^+~+ngwX#X|!9Y!eY! 9N#F*qePY̓^*S!! ^#V*se̓^ʗS!!W!!W"}t^YS*}t^{S!"}!!!iY!"qe!*}|ʇS!`i"qe!! ^#V"se!Y! 9^#V)))`^Z!SZ"*aa!"aa*_aS*_a!4S#4*ca+"ca}S TY! 9N#FSN!!9^#V!9^#V!$ ^!ͅY!$ ^!9~#foL^!$ s{mN`i!~#fo#s#r!Y:ndN!}2md!}2od}2nd!md! W! !W:odo&t^N!}2nd!:`o:ndo#}2nd&md#s!"oe:ndo&DM!9~#foͯ^O!9^#VB!! 9s#r*I! 9~#fo#s#r! 9^#V! ͮ^LInfHt^VII!"}!!`DMfI`iDM`i~#ʇI!9^#V`i^#V͠XʇI^I! ^#V!9^#V!L^#!9s#r!9^#V!L^Inu}I!"}!!9^#V!L^Inu}I!"}!! ^#Vsrn! ^#V`i^#V^! ^#V! ^͊Ot^\D!`in\^s!`is#r! s#r!!9^#V!t^ʓD!`inL^s!`is#r! s#r!`i~#¤D̀E! ^#V!t^D!!9! ^͊Ot^5D!9^#V! ^#V`is#r! ^#V! ^#V! s9F+N+V+^+~+ng対Y#Yx+Yw+Y# Yw|!9^#V#n~MYHY#;Y!|!9~#foeY#\Y}!9^#V#N#F#nxʃYs# xY! 9F+N+V+^+~+ngRʭYҫY +!9~aY{Y o&!9~AY[Y o&DM!99`iY|D To&"}*caY!9!69^#VNWDM{X!9!WDM͔X`it^WT!"}!!Y!9N#F! ^#V+))!9s#rT!9^#V}U|TPY̓^T!9^#V!9~#fo_ʿT!9^#VT!9^#VͅYY! 9^#V!##~#T!!ueDM UK!9^#V*oemdͅY`i*oe"oe`i:ndo^}2nd`iY!9N#F!QO#!9~#foͮ^ʆO! 9^#VW`i#DM+s!t^†OJOY! 9^#V)))`DM!9^#V!9^#V! ^#V! ^)`^#VYY!DM!9^#Vn&&{X$~?Pn$&unu!Hut!9^#V!9^#V!9^#VnfY! 9!ͮ^SJ!Hut!! 9^#VY! 9^#V!ͮ^‚J! 9^#V! ͯ^ʌJ!"}!! 9^#V)))`DM! ^#V! ^#VY! 9s#r!! s! s! s`is!H! s#r! 9^#VY!5cDMJ`i'DM`imd#r!`in\^s!9^#V`i~#fo#s#r+s!L^Y!u_DM`i~fE`i DM__cE!BE!`is#r! s#r! s#r`iY!9N#F! ^͛SʶE!! s#r`i! s#r!}U!9s#rzʜE!! s#r!`in\^s!9^#V! s#r!fa,M!99!Y`i~# xZ!9*Z_a~#1Z!>ZIZ|!sbcZ!kb~#~#~#~kbw#w#w#w!nb*mb*kb"sb"ub*sb*kb"sb"kb*ub*mb"ub"mb!kb>w#Z!kb~]#Z]=ɯ<nb!vbO~[nb!vb! ^#VBK`i_(U! ^#V_\U! ^#V`i_YUPY_\U! ^#V_\UU! ^#Vsr! s#r`i"ye!Y!9^#V###7^#!9s#r*ye|¯U!ue"we"ye!ue*weDMU`i! ^#VBK! ^#V`i̓^'V! ^#V`i^#V))PYt^'V! ^#V^#!^DM!9~#fo_$P!9^#VBK!9^#V Q?P͔X!!9^#V`i^7^! 9s#rzʴP! 9^#V!9^#V`iͽS!9s#rzʴP͔X! 9^#V!9~#fo^'^PYDM|±P!`i! 9^#V!'^PYDM`i!9~#fo_Q!9^#V`i^!9^#V`i QQ͔X`i_K`i%~KJ!"}!!9^#VNW!9s#r!t^FK!"}!!9^#V!t^aKlX!9s#r!9^#V{X!9^#V!L^ʇK!W!Wt^K!9^#V!L^ʽK!Wt^K!"}͔X!K!9^#V!L^t^K!"}͔X!!!! s#r!# ss# yF*"*_"-F_FY!!b!ͅY!:o&L^bs! H"wb!bDM!"3c*3cͮ^G`i^! t^•F`i^! t^ʝF`i#DMyF`i~G`i^!>t^ʻF!F`i^!<t^ʤG!`i#DM^! t^F`i^! t^FF`i`i#DM~.GZZ+[kb!sb#[kb!sb#1[kb!sb#E[kb!sb#Y[kb!sb#m[!kb~/w#}[:sb?*kb*mb))қ[,=“["mb"kbî[:nb:sb?[W!nb~w+¿[¸[!NyýZkb[sb[y9\Zkb[ysV`i~#fos#r! ^#V##^#V! s#rU`i^#V!9~#fo_V`i^#V!9~#fot^]V! ^#VsrëV!9^#V))PY"ye*yeut! ^#V*ye##s#r`i^#V!9~#fo^*yes#r!9^#V`is#r"ye!! s#r`i`iuet^ W!2XDMt^V!!`is#r!! s#r`i͔X!9^#VY! 9N#FSͮ^,Q!!9^#V!$ ^!!9^#VͅY!"W"}|dQ!!$ ^!9~#foL^!$ s{–Q`i!~#fo#s#r!Y!9N#F!9^#V+#|Q`i^! t^Q! !W`i#DM+^!WñQ!9^#VY!!$ s!9^#V!& s`i!9^#V!s#r!9^#V!L^#!% s!fL!9^#V!s#r!9^#V!L^_L?R͔X!Y! 9N#FR!W!!% s!Y! 9^#V)))`DM!9^#V!9^#V! ^#V`i^)`^#VYY!DM!9^#Vn&&{X$~@Mn$`i^! t^G`i^! t^+G!`i#DM+s.GF\J|MG!H[G!Ht^ʡG! H!X!X!,H!X!! W! .HG`i*3c#"3c+)wbs#r`i#DM~G`i^! t^G`i^! t^G!`i#DM+sGøGlF!wb*3cͯb[9\ob!kbw#\Z9\9\ob!kbw#/\!obw#?\> !kb~w#N\Oob!sb#c\y|\!kb4=G\=ʭ\!kb~w#ˆ\Oob!sb#›\y|\r\ob!sb#¶\!kbob~6#\> !kb~w#\\kb!sb#\=\T!ueDMýUZWZ*_aDM*aaogZ6Wo&Z*_a*+++*aaDM*ca!9N#F#^#V eW iWZWkb6#> 6 #=pW>6#=yW &XښW0_zWÄW/¤WçW : >W A X[W@Wa X{ X`w# .WXWXw#W{o|g XX9N#F!9^#V+#|6R`i#DM+^!9^#VWR!9^#VY! 9N#F!#W`i!~#oR!!$ s!`i!~#fo+s#rSʌR!!_ʿR+^!̓^ʼR#ÿRÒR!$ s!t^R`i!~#fo#s#r!!$ s!Y!"q&!^DM!9~#fo_%M!9^#VBK!9^#VN@M͔X!!9^#V`i^7^! 9s#rzʨM! 9^#V!9^#V`i͵S!9s#rzʨM͔X! 9^#V!9~#fo^'^PY! 9^#V!'^PYDM`i!9~#fo_M!9^#V`i^!9^#V`iNM͔X`i͔X!9^#V!.HCan't open file for redirection: $Y*p`Y!DM`i ͮ^YH`i#DM+\J?H! 9~#|H!WL^|H!HTFA:$$$.SUBY!"}!Y!con:CON:lst:LST:prn:PRN:pun:PUN:rdr:RDR:Y!9^#V!!9^#VHY!`$     Z]!Z]!))], ]}o|g=]=]DM!>))D_ *SERIOUS BUG* in modify, can't find file in sd any more This is the entry you have chosen to modify: %02x What is the new file name? (Press RETURN to keep current name of %s) (Press ESC to go back to Main Menu) --> 8 characters max! Thawould require. The new file will fit exactly on top of the old one. Erasing the old version of the file. WARNING!!! DO NOT TOUCH THE COMPUTER UNTIL THE ERASE IS COMPLETED. DO NOT INTERRUPT THIS ERASE!!! Erasing..... Erase is complete. Copying file % u+Vv4X^;}PyDD6DD]Í64XFVvv4^Pv^;tG6&V6V6F6464X^+ƁZP6X3]ø]Ë]Z6 u聚6 u臙 uH4P6FVvPv7^;tP6&X^PvY+6F6F6&vV6V uH4P uH4^# u 636 u$F0P6XF0P6X6 uR6 u YP^ =]}{_4^|?^|7g}o^{_4^)/^}{_4^|g}o?^|g}o|/g}/o|g}o|g}o|ʍ^~^}~^|ʍ^!}^|~^!}|^}|?>o&zo&|^}|>o&|o&}/o|/g#}}o|gBK^#Vz^#y^###^#x^#~#fot's not a valid filename. You have modified the entry to read: %02x This is the operating system entry for %x Do you wish to modify it This is the operating system entry you have created: %x Updating Control Area Directory Updating Ops to hard disk Updating Control Area Directory Updating Operating System TablemY!M!!9$t^ʃ!9! 9!9 !9s#rz±! ;!9 !9s#r!̓^!9s#r!9^#V*H_^`͖]!9s#r!9^#V*B_^͖]!9s#r!P ;$" Y! 9^J! 9^!] ;YͅY`Y^A>MD*! *BUG* bad argument to syslib1! (0x%x)Y!A!!9$DMt^ʪ!9!9!9 !9s#r!!!!9͍L#!9^#V!9͌Ǒ!9 7^P67XtYP7^P67Xt3YP7^P67Xt6 uYP7^P67Xt3YP7^P67Xt3P7^;ub6 u2P6^+PYP7^P67XtXYP}|>?o&}|>o&'-6K_hp{{e 0{q{222???????erating System TableY!9^!At^!9s!!9^#V!9^#ViY!9~{! ;!4 ;!e ;Ã!s ;! ;!9^#V+!9^#V! 9s#rzÙ!9^#V^!t^Ǚ!!9^#Vu! 9!9^#V!9~ʠ! 9 ! 9!͛p!͒!9^#V! ;!9^#V 7!!9!9^#VͅY!DM! ;!9! ;!Η ;! !!9iY!! 9ͯ^ʪ! ;k|f! 9^!t^Ô!!9s! 9!9s#r!9^#V^ͯY! 9~#fo#s#r+s{ؔ! 9Σ[!!9s#rz!9^#V! 9s#r!9 !#9s#rzŽͧ 0͓^`!͑ ;! ;Ǒͧ `]*H_!#9s#r!9!9!)90ڏ!!'9!9ͅY! 9^#V!|9s#r!@!>9!'9^#V!ͅY!9!'9ϟ!!9͍L#͕LZ[̈́]7^P67Xt3P7^;u6 u6 uYP7^P67Xt3P6 u YP7^P67XtYP7^P67XtYP7^P67Xt3P7^;u(6 PY????HHHHHHHHHHHHHHHJHr`Hr`Hx`Hx`Hx`Hx`Hx`Hx`H~`H~``HLqN4O HOQQ 00000 f! 9 K! ;! ;!P ;!pH!f!9^#V! ;f!!!9^#VH! 9s#r!t^ʝ!9^#V!˜ ;!! 9 ۚ! ;! ;! 9u!. ;!! 9s#r!! 9s#r! 9^#V!t^=! 9^#V What is the nam! 9 ?!!9!9"?! 9X!!9!9ͅY!DMc! ;k!DMxN!9!9͌ƒ!) ;͒!9^#V!Q ;!9 ¯!DM!9~#{x{!`!#9!#9^#VͅY!X ;!9u! ;ͫ !9^#V! ;!!9 Do you want to overwrite it That file is not in the Control Are!pW!9!#9ϟ! ;ͫ !9^#V!ܘ ;!!9_ !9~#! ;ͧ !9s#r!9^#V!!W!`*H_'! 9!! ;!9!9!9Ǒ! ;!!9s!9s!!9s!9s!9s!!9^#V!9ͅY!>_ !!9~#Ǒ!? ;!`!%9^#V!)9ͅYͧ !!W!`*H_'! 9!D_ \J There is no room in the OS Table for the entry that this new OS P7^P67Xt33]ø]Ë]룍uP;P<̃P uH4^ uP;PA˃P;P2˃;P6PRPYP7^P67XtX]f64XFVvPvs^;t&F64XFP6^;ƸuH^# uvP6j;X6j;VP觉 u"F u 3#6螋DD u ]3PDDPF^;uYP7^P67XVBDDPÈDD]vTDD637P"DD]Ë]*64X%     a but it does have an OS Table entry. This is an unusual condition. If you proceed, the new entry will replace the old one. Do you wish to proceed You have asked to read in file %s. Can't find the file (%s) to be added. There is no file in the ^;t 3]øUPF^;tP6j;XP6j;XP<_DD6j;VP_6LDDP^PPtcPF^PYP7^P67Xt X4V{UDD@6YaDD uFPDD u3]K]Ë])~P;P*P,!]*B_!9s#r!9~#ʱ!9^#V! ^#V!9^#V! ^#V!9^#V! ^+͈]!9^#V! s#r!9^#V! ^#V!9^#V! ^+͝]#!9^#V! sլ!!9^#V! s#r!!9^#V! s!9^#V! ^#V!9^#V! ^!9~#fo+7^! 9s#r!̈́]!9^#V!s#rz?*<_|?!"<_!":_*<_|K!*:_|[! ;*:_|Œ!the newits What is %s Memory Load Address (0-FFFFFFFF)? (Press RETURN to keep current value of %lx) (Press ESC to go back to main menu) --> Invalid entry What iport file #%d --> Y!9^#V!9^#V!9^#V;Y!"}!9!YZ̈́Z!9^#V͂!9rZLZ]ʍ?!9`ZY!"}! 9!YZ̈́Z!9^#V͂!9rZLZ]4!9!YZ̈́Z!9^#V͂!9rZLZ]4!!Control Area Directory named .Y!DM!!9^#V!9s#rQ`i#DM`iͮ^ʆ!#9~#fo#s#r+^!9~#fo#s#r+sL!#9^#V!9s#r!9^#V^#V!#9^#V!Ws#r!!@!%9^#V!iY!DM!!9^#V!!9s#r`i#DM`iͮ^+!%9^#V~+!%9~#fo#sPYP7^P67Xt XX]}6P60X6 u6@0 u  @0]n}3PP%6^TDD襽 FPF^;vFPSDDvPSD9^#V! ^!9~#fo+L^#! 9s*{͈]+!9s#r! 9^#V!9~#foͯ^u!y ;! ;! ;͟! There is no room in the Control Area for this file. You can make more room by deleting some files or by running EXPAND.`i"@!< s# y"B"s %s Entry Point Offset (0-FFFF)? (Press RETURN to keep current value of %x) (Press ESC to go back to main menu) --> Invalid entryY!9!9^#V!ͰrZ*<_|ڨ!9`ZZڨ!"<_!9`Z!9`ZY!9^#V! ^#V! 9s#r!9^#V! ^! 9s!9`Z̈́Z!9^#V͂!9LZ]7?!9`ZY! ;*}t^d! ;È*}t^{! ;È*}! ; *BUG* bad fd to lseekinvalid param to lseekerrno = %d from lseekY!DM`i#DM! 9~#fo#s#r`iͮ^/! 9^#V^! ̓^/#r+^!9~#fo#s#r+s! ;! ;!' ;!_ ;!DMX`i#DM`iͮ^! ;! !!9iY!! 9ʢ! 9^! t^ʲ! ;`i+DMS! 9^!t^`i)))!!9~#fo! 9S This is an OS file and may require other fDLPSDDPSDD]}FPF^;r&3PFP.%PSDDv]|60 u FFv3aP3P$v!DD PF^+ƈF6 u33PP6F^^P60XVvtV1PD">!9"<*t^6:wVt^]O:w*>!9s#r*@DM*B*D!9^#V* Enter file name or ESCAPE only! Y!!"9^#V!!&9^#VͅY!DM`i#DM`iͮ^[! PPF^^P60XVvtV˹PF^P66XPvXFP6FP6PS 6RDD6RDD6RDD6RDD6RDDPP#6wRDDPP#6`RDDqPVRDDvt3vt3^#v#DDv&DD u9!! ^#Vk]LZ͆[̈́Z!$ ^u]͒Z[͝Z`Z[rZn!"}YZ^J ɮM!!# s!9`ZLZ]ʩ!!! s#r!$ s!"}YZ!9`Z̈́]L^!$ s!9`ZLZͪ[̈́]!! s#r!9`ZY! 9^#V)))`~!"}!! 9^#V!9^#V!!9^#V!9^#V͍L̓^P*}! ;!!9~#fo#s#r$! Sectors copied: *YIKES* attempt to increment to track 0x%x in add%c%02x *BUG* read != 128, errno = %dY!9~#!9^#Vg !9s#r!͓^!% ;!] ;!̓^! 9~#fo#s#r+^#+s{ʅ!DM^`i#DM! 9~#fo#s#r#! 9^#V^ͯYu}ʅ`iͮ^ʅC!uY!9~#ʪ!g!9s#rõ!o!9s#r!":_!9^#V!s ;!9~#!9^#V!`Z̈́Z! ;!Χ ;!9~#1!9^#V!!! 9iY!\ ;! ;! ;!ϡ ;`i)))! 9~#fo^!9s{ʊ!9^!̓^ʊ`i)))! 9~#fo1Ò! ;! ;!! 9|! 9^!t^[t^:! ! 9s{:!PY^)))`i)))!"9~#fo`i#)))!$9~#fo)FFP6VvtX^;|3PPv3VvtX^;3PPv3VvtX^;P3Pv_6VvtX^;|P3Pvh4PvtX^;Ƹ|HPPvtX^;Ƹ|H^# uPPv)))`^#VBK!9^#V!! s#r!!# s!$ s!PYP7^P67XtJXYvPYP7^P67XtYFPYP7^P67XtXPF!9^#V!]*B_ There is no room in the Control Area Directory for the new entry that this file would require.Y!9^#V!̓^! 9s#r!9^#V!9^#V! s#r!9~#!9^#V! ^#V!9^#V! s#r!9^#V! ^!9^#V! sug !9s#r!9^#V!!9^#V!`Z̈́Z͗rZh!9^#V!!!ͰrZZh*<_|h!"<_!":_*<_|t!*:_|ʄ! ;*:_|µ!9^#V! ;!9~#ʿ!9^#V!^#V!1 ;!] ;!9~#!!9^#V!^#Vu]̈́Z͗̈́]!9^#V!s#r?!!ͅY!!!$9^#V!OiY`i+DM`i)))! 9~#fo! 9 Press RETURN to keep current setting. Press SPACE then RETURN to erase entry. Press ESC to stop entering names. Current support file #%d is not used. Enter new name for sup&      `i"!s# y&" """!9"*t^[:wͧ{t^ʂt:wͪ*!9s#r*DM* *"!9^#V*{YCx½!"*i^!0ͮ^ߎ!5 ;!":7PF^;tFPDDF7PF^;t8PYPF^P67Xt^;uFPDDF7CPDD u6;F6;V,DDF6;PF^;ux;PPF^P5 uYPF^P67XV}DDx;PP6;^P~ u!YP6;^P67XV肪DD PF^;t6;P6;X6;V2]nSPPR62DDDPPR64DDDPPR66DDDPPR68DDDP PmR6:DDDP PVR6<DDDP P?R6>mDDD]ZmPMDD3PPR60GDDD]9m3FF=|1P3FP9~#fo+s#rs! 9~#fo#s#r|! 9^!9~#fo#s#r+s! 9~#fo+s#r|^ ڔ ڔ2ä!!WL^!9s{ !9^! t^!9^! t^̕!!!9^!t^nEnter Password: $ $^C$ $Y! 9^#V! +!9^#V!9^#V"ʏ!" Sorry, this program requires BIOS 2.248 or greater. Sorry, your system has an old style password table, to upgrade to the new style run the password utility PW version 1.1 or later. GetPW called with bad utility nPF^;tBPYPF^P67Xt^;t FFP>DDFw7PF^;tFPDDFR7PF^;tFPDDF-7PF^;tPFPvF7PF^;tPFPMF7PF^;tF6;FP6;Vy7PF^;tO57PF^;tc7PF^;t7PF^;t7PF^;tC7PF^;t7PF^;t 7PF^;t 7PF^;QFP6)X4V DDDv3PPQPCDD]l 3FF=|3F6ovPvX^;rPvX^P67XvP63vPOQPvX^P6sXv u4PPvX^P67XvP63vP1PPvX^WPG3]Ë]q3FF;0|60v3v3FF=`|66v3v],q P(HDD3umber = %d Automatic Password checking in effect Y*|t!!$!!!Ͱ%! 9!"!YC!!$!ͫXš!!SB0000Y!9^#V^!L^! 9s!9^#V^!L^!9s!!9^#VnL^s!!9^#VnL^s!9^!\PFP$F7PF^;tPFPF7PF^;tFP+DDFd7PF^;tP3P6^;u96TFPFP6PFPFPFFPvX^;tFPPF^P6;JX^tJe7PF^;t`K7PF^;t17PF^;t7PF^;twFP6;X6;6;P6;VPP9PfDDPP!PNDD2FPADD].:[6;VSDDxP67XvP63vPv)v FP6a^ƉFvVvVvVvVVF^ tPF^PVF^ tPF^PVF^ tPF^PVF^ tP6PvX^PF^^+PVF^ tPv^PF^F 6RVPQ6R蔙DDPP,RFPF^;t 37]UvVDD^v3v3vvVDD uDFFPvV DDvVL DDvV= DDvV DDF u4PPDD6(VPP6(SDD u^T^!9^#Vn\^s! 9^!\^T^!9^#Vn\^sY!!ڒ!9^#VͫXʀ!!!9^#VͫX! 9^#V!!9^#Vͥ! 9^#V!!9^#V#ͥ! 9^#V###!9^#V##ͥ! 9^#V //////Y!9^#V!ͯ^!9^#V!͔^!PPF^P6;<XPǭvDD]ȸcPF^;wv1dPvY+v 0P PF^ t3^PvX0P P PF^ t3^PF^+^PvXv3]EȸPZDD']3 uP6j;PP6;^P|| u!YP6;^P67XV DD]͸P3P蒲P迤DDt;P赤DDPPpP蝤DDPPXP腤DDP6;^P6;P'6hUDD uP3P6t2DD]$3F^+ƁPVF^ tP6PvX^PF^^+P`VF^ tPv^PF^^+ƁPVF^ tPF^PVF^ tPF^PVF^ tPF^P P@DD]\j.FFҊFFԍvVvVvVvVpVF^ tFܾwnkPrPDD6&VPP6&RDD uP;P6VeP)PDD6*VPnP6*RDD u<43PDD u3FPODD6,VP&P6,LRDD uPF^;vJFPvP v!9~#fo+s#r!9^#V!͝])!9^#V!͈]!9^#V! ]0^ ^L^Y!! 9!9^#VͅY!!9s!9!9H!!9s#rô!9~#fo#s#r!9^#V! ͮ^!! 9!9^#V! ]*ͫX!9^#Vå!Y! 9^#V~_! 9'     ;XP6j;X6j;VP輨P肞DD u[6tDDPP PDDFYPF^;t*NPF^;t P DD]øP DDYPDDFP耞DD~PvDD3PP2PrDD3PDD]ENJBPϝDDPPƝDD~P2DD3PvDD] u60 u AFAFv&P60Vփ`P6&vV6PփVF`PeDD^ tFVv&Pv^;t'VvDD^;tPגDD]vDDPDD6VP3]Ë]5636(6VvPv:^;t!P6P&P܃3]ø]Ë]зVF^ tFVFF^ tFV3Pvva^;t]þVF+FP6&Vv蘐^;t]ËF&F&3]Ë]66P60^;uXF uP6j;XP6j;X6j;VP螝6iDDPPFPF^;ƸtHP PF^;ƸtH^ u3]ÊFPDDvlDDPDD3VvDD^;t3]ø]Ë]M u3VvDD^;t2vFP ^;t@3FF;|,vPvXvvvPF^;t3FF=|vv3vF3FF=|vvF3FF=|^PF^# uFPvvY F5PvvY#PFYFP!<6U0!*%$_ ]Ë]Ƹ7P)P u 6]37P3Ph u 6]dƸP=P? u 6];ƸPGP u"6E64 ^PDDP6X64^PDDP6X64^P6X u 63 u-6464X^P!DDP6X 63]NPVF^ t^FF;FuPvY60P6X6 u[6 uYP7^P67Xt3)63YP7^P67Xt]3]Ë]耶6P60^;u|3UP6^;tX3P^;ƸtH6*PYP7^P67u3]ÊF uF u FFFP6j;XP6j;X6j;VPxvDDDPPov螒DD6DD u PDDv3PٛDD]Ë]ZF u FFvP uPFvPFYFv_F3FF=|vvF3FF=|^PF^# uFPvvY F5PvvY#PFYFvPFYFv_]7*P6^;t]øUP7 u]ŸPQP u"67 u]Ÿ7P[P u 6]Ÿ7PePe u 6]hŴV3P3Pv$^;t5VPLVvf^;t6PvF]Ë](PvvՃ]PvvՃ]ڰ Pvvԃ]Ȱv4^Pvvԃ]訰 F3FPP? uPDD7P[DD]øPϐDD7PBDDPP莈FF=tAPDDPP6 XD^+PYP7^P67XtX]3]Ë]ڵ7 u$]µP3Pf uPDD7PDD]øPDD7PiDDPP赍FF=t1PP!P6PXP蹍DDFPP膛DDPvSFPF^;tVFPDD^;tF u63V64X^;t`VFPDD^;tF33V64X^;t*VFP4DD^;tPʚDD]øP躚DDPԐDDPP6$3DDv33]Ë6^;t[1 u PDDPDD6PgDD6 u PDD]Ë]謿6P60^;ƸuHP6X#V^ u]Í60 u u F@F@FP/DDPVFXF=t vCvKv33FPF^;r6PF^PLXVFPs uvV3PPF^PLXtvN^;t_F=t(VP6ƄVv聝^;t/%VP6VvY^;tDDPDD637PDD\6 VP誐6 ВDD u FR3FPF^;r9PF^PYP7^P67XtX3vYP7^P67XV蕉DDPʏDDP6j;XP6j;X6j;VP uI3PYPP訋DD6PPP6j;X6j;VP諕6їDD uv膍DDPLDDF637PDDvDD]虴3PDD6VP<P6V܃6 06 B636V6&V6V]VP6&Vv5^;t>P6&Vh u#6&V6V3&&3]ø]Ë]諹 uH4P^# u6苜DD6*]Í64XFF=t VvPvp^;t&Fv u @^ t^PF^+P薕DDVF^ tP聕DDP60^# u43FF;F|!60vPVDDvn3FF=`|^PPvX^P60XVFPE3FF=|vvPDDvvP0DD3FF=`|]3]Ë]F*P6^;t]øAP6^;tG3FPF^;r.FPPF^P6ƄXXv u-oPrDDFF=t63]C3P|P苛FF=t3PPpFF=t7^P67XVFDDF^;tPF^;t(YP7^P67XV賍DDP4DD]ø PF^;tYP7^P67XDF;PF^;tPDD6VP*PF^PYP7^P67XtX uH4PPF^PYP646&XV6V646&XV V64 ^PDD^ tFVv&Pv*^;tAVPGDD^ tFVv6Pv^;t 6V6&VV64^PDD^ tFVv6&Vv行^;tF u@FaPvYV3PV64X^ tPv虑^;tuVVF^ tP6&Vvˑ^;tDF`P60V&P܃`P6PF`P6&XVp܃3]ø]Ë];64XFF=t@66vP虔DDv]F=t>PDD3FF=|!6ƄvPKDDvtF=teP蝔DD3FF=|H6 u66vPDD6vPۓDDv]Ë]0P蔝DDP6j; 6F=u_vP u;v藛DD u63] 6 63AP6^;tv F=tvvP6 uP6P6V]vDD]Ë]&3PF(     7^P67XtXXFPYP7^P67XV^P;^PYP7^P67XtX uPvY P;^PYP7^P67XtX uPvY P;^PYP7^P67XtX uPv PvYYPcyDD]^l u P PF^ t3^PF^;t .PAoDDBP5oDDgP,oDDFP!oDDNFF uY3FFPF^;r'lPPF^PvXXvPF^PvX3v3FPF^;t]ø PF^;t3]øPP諂6JtDDFP DDPP艂6LtDDPPr6NtDDPP[6PtDDF u v3FPDDPvŃFPDDPDDP64X^PvCOPvLFF u+Vv4X^;}PyDD6DD]Í64XFVvv4^Pv^;tG6&V6V6F6464X^+ƁZP6X3]ø]Ë]Z6 u聚6 u臙 uH4P6FVvPv7^;tP6&X^PvY+6F6F6&vV6V uH4P uH4^# u 636 u$F0P6XF0P6X6 uR6 u YPvY ; uDP;^PYP7^P67XtX uPvY P;^PYP7^P67XtX uPvY  uPՌDD趥FF3PF^;tVv DD^;t $F6 ]@P6j;XBP6j;XDP6j;X6j;VPx6@hDDP^ƁPP|F u 6FnDD 6HnDD ut6DDDPPxFPF^;ƸwHPPF^;ƸtHP PF^;ƸtH^ ^ u F] PmDD=tFPDD!F=uvFP i7PDD]Ü 3F3F6VVPk}6V6DDPP}FP|DDPF^;t]3PP7P PrFPF^;v3FPF^;ry6VFP^# u蓚 uH4P6^# u轚]ܡ u[YP7^P67Xt7P}DDP^;t] P^;tHYP7^P67XtP^;u\PYP7^P67XV覀YP7^7^P67XtYP7^P67Xt3YP7^P67Xt6 uYP7^P67Xt3YP7^P67Xt3P7^;ub6 u2P6^+PYP7^P67XtXYPu]PF^#PPF^#PPFX#X X VPF^;ƸuH^# u6VP而9PF^# uUVvqDD^;t@F u/ 6 u6 u 7PCDD,޸PF^# u5PvDDF^;tF u] FF=}&3P+FP{PmDDv,]זvdDDFFF3PP{vhDDFFFPvX^ t3FFF ufFjF@PF^;t 3FjFFPPF^;ƸtH^# u]ÊFP PF^F^PPDDF^;uDPF^;wP P?r6P6P6 uH4^#^# uP Pq6RVPM|6RDDPP|FP{DDPF^;t]3F3PPF3FFPF^P DDPvYP67XtPYP7^P67XVmYP7^P67XtPPPh uyP3PH ubwYLҸYP7^P67XVzDD5PZDD7P9DD贞 hQYP7^P7^P67Xt3P7^;u6 u6 uYP7^P67Xt3P6 u YP7^P67XtYP7^P67XtYP7^P67Xt3P7^;u(6 PY 7PDDPF^# uvVvDD^;tUP6^;tPvY 6 uPvY 7P{DD7PoDDPF^# uP uH4^ uVvDD^;tJPF^;u6VP܊;ƸtH^# u v虾DD]ÊFPPF^;ƸtH^# uF=FPvXP{DDPPlPlDDFPvXPLDDPvY+PvX^ t3FPF^ƉFFPvX^;v&3PFPzP3lDDvF>PqDD PqDDv DDPvYPqDDPPvX^ t3^PvYvv PvYMF u 6^qDDP Pp6P6P6 uH4^#^# uP Pp6VPz667XtJPPYP7^P67Xt<^P譄PvDDYP7^P67XtJPPYP7^P67Xt<^PTPvDDc]kYP7^P67XtJPPYP7^P67Xt<^P6jP7^P67XtX3]ø]Ë]64XFVv Pv^;tP6&X^PvY+6&vV6VUP6^;ƸtHP uH4P^#^# u 6*`6 u YP7^P67XtYP袀DD36* 7PDDC u27PDD uH4PF^# u葢~۸PF^# uGVvRDD^;t,PF^;u6VP(PDDPF^# u6P^# uH4P*PvXPDDPvY+PvX^ t3FFFF;F~(FPvXPvvXvv,v,FP^ƉFFP^PvX^+ƉFvv0yvvV DDvvy PjDDFPPF^;ƸtH^# DDPPF{F]Ë]ZP6j;XP6j;X6j;VPz6|DD uP(zDD6\VPmzFPF^;v3FPF^;rmv3vFPF^PqvDD u264vDD^;|vFPF^P vDD]3F6;PF^;r8PPF^P6;<X^;uv}Ћ]ÊFF|FF6;PF^;r)FP6;V}FPSDDv]R u F}F uaFPDDP7^P67Xt33]ø]Ë]룍uP;P<̃P uH4^ uP;PA˃P;P2˃;P6PRPYP7^P67XtX]f64XFVvPvs^;t&F64XFP6^;ƸuH^# uvP6j;X6j;VP觉 u"F u 3#6螋DD u ]3PDDPF^;uYP7^P67XVBDDPÈDD]vTDD637P"DD]Ë]*64X)     u]F;F|FvvPDDPvYvvPDDPP,jv PNjDDFPPF^;ƸtH^# umF=VFPvXP6DDPvY+FPvXPDDPPiv, PiDDF;F|F^;t 3]øUPF^;tP6j;XP6j;XP<_DD6j;VP_6LDDP^PPtcPF^PYP7^P67Xt X4V{UDD@6YaDD uFPDD u3]K]Ë])~P;P*P,F^;uFPvX6 u vSvLv33FPF^;r6PF^P@XVFP2 uv}V3PPF^P@Xtv2\^;tKVP6&Vvt\^;t*6&FFF6P60XVƃ2PvVPPF^^P60XVƃvPPF^P66XX3F7]37]Ë]蒈F u)6VP8i6DDPPiF.FP6VP#i6԰DDPFPjiFPF^;Ƹt]FPDDF3VFP6X4X^;u6,FP6X4XF6ƻvFFP6YFP6X36ƻv3v6Y+64X+FP6FP6FFPU3FF=Z|GvVFFF;F}(vvPFPvXXv,FPvvXvvVDDvvFPpDDPvYFPXDDPvYPvX^ t3FPvX^ t3FFP^ƉFFP^PvX^+ƉFvvv PhPYP7^P67Xt XX]}6P60X6 u6@0 u  @0]n}3PP%6^TDD襽 FPF^;vFPSDDvPSD u FFPvv^P`^^ƉFPvY+F=1VVF^ tP6|'Vv[^;t3FvPF^;rRv Pv^+^Fvv60vVvhvvYv`P66Vv<HP PF^;ƸtH^ u3]ÊFP\DDF u v7DD;Pv73VvRDD^;t3]ø]Ë]蠇V3Pv_F^;t3]þVvYDD^;t3]þVvDD^;t3]v_DD]Ë]4 u;P6j;P6X4X^;vFP6XY+vFPDDPFP]辌FP7DDFFP6X4XF6FFF]Ë]zPPF^#^#ƉF PF^# uPvY@PF^# u<PvYvDD]PF^;tC5 u PhDDPhDDF5 u dPhDDPF^# uF`PF^# u v PPF^#^;w v5 u PShDD@PF^# u ^PgDD PF^# uDLPSDDPSDD]}FPF^;r&3PFP.%PSDDv]|60 u FFv3aP3P$v!DD PF^+ƈF6 u33PP6F^^P60XVvtV1PvZDD]øPqbDDPXDD6VPbvZDD3]Ë]ց umfuP;PP;P7P6j;XP6j;X6j;VP=b3FPF^;rBPPF^PYP7^P67XtJXY+vPYX6j;VPg6iDD u]øPYgDD u3VPjDD^;t0PPP' u3]øP gDD} P6j;XP6j;XPfDD6j;VP'g6DDPPkPJ]DD6+iDD u63PfDD1,F]Ë] PnlDD6\VPlFF=~3FF=|m6VFFPDDF^;uvFFP^ P VFF^ t^PFF^;t .PbDDv PvYgPkDD]BvϳDDFBPaDDlPaDDF $PgDDFPgDDPPF^#^#PPi5 u dPgDD PF^;r_F5 u PgDD^P$gDDP@PF^ ^#P gDD5 u dPggDDFFPfDDF]Ë]>PF^;t FyPFPPF^^P60XVvtV˹PF^P66XPvXFP6FP6PS 6RDD6RDD6RDD6RDD6RDDPP#6wRDDPP#6`RDDqPVRDDvt3vt3^#v#DDv&DD uP7^P67XtY+YP7^P67XtFYP7^P67Xt3P;P*P+/PYP7^P67Xt XXYP7^P67XtFYP7^P67Xt3YP7^P67XVeZDD7Po\DDFP`DDPqDD u+63PPj6\DDPp\DD]Ë]΅*PF^;t /]øUPF^;t7g u 3]B uP~PeDDWVP4DDF^;tCVP@Vvl^^;t"vA6PaDDFPaDDv`bDD]; u'6 uP6;Y%P6;Y8 u uPF^;ƸtHo2 PP26faDD6]aDD6TaDD3^F PF^;teF uy! P6^# uFF`PF^# u v PPF^#^;w v PF^;r FFF]Ë]藏PFX#VPF^;ƸtHP PF^;ƸrH^ ^ u]3]Ë]G3Fv u$vPDDPvY)FFP6VvtX^;|3PPv3VvtX^;3PPv3VvtX^;P3Pv_6VvtX^;|P3Pvh4PvtX^;Ƹ|HPPvtX^;Ƹ|H^# uPPvYP7^P67XtFPF^P6;XFFPYP7^P67XtX3FPF^;rBPPF^PYP7^P67XtJXYvPYP7^P67XtYFPYP7^P67XtXPF u vSvLv33FPF^;r6PF^P@XVFP3 uvV3PPF^P@XtvS]^;tlVV0`^ tP60Vv|]^;t2`P66V6060VCAPj;XdP6j;X;P6j;VPj;P6dWl u) PF^;t PDD uFPF^;ƸvHP PF^;ƸsH^# uFPvV  u PvY+60 u43PvVP6F^^vF]Ë]FPzDDF3VFP6X4X^;u FPDD646^ƉFvv64FP6XXvDDP6ƻvXvDDP6YvDDP6Y+6FPhDDPFP*     3PvtX^;ƸHPPvtX^;Ƹ|H^# uPPvPvtX^;Ƹ|HP3PvtX^;ƸH^# uPPvM3PvtX^;ƸHP3PvtX^;ƸH^# uPPv<vlDDv!DDv$DDv^P6X^P67XXFPF^;t#PvY+PvY PF^;r#PvY+PvYnPFPPZPF^;ƸvHPAPF^;ƸsHX#V)PF^;ƸvH^ ^ uPvY+PPVF^ tFڋFFFPvXFFPvXvv؊F^PvX^^+PvXv4vXv4XFPvXFFPvXv4vXvָ^PF^PvXv4vXv4XF+FPvXv4vXv4vXFFPvXv4vXv4vXv4vXCPPF^P6;XXvVJ DDFFCVm  |GECA?=;"_QC5' 7P6P;P訒P6^# u PkDD]37]Hn uP;P6PMP;P6vtXV3P3PvL^;t/VP&Pv]M^;tV3PVvtX^ tPv~L^;tVP6'VvL^;t/V3PVvtX^ tPv+L^;t3VvtX^;twv uvtv uH4PvXv!DDvbDDvtvt&LFPF^;ƸvHP PF^;ƸsH^# u PvY+6 u33PP6F^^P60XVvtV51PPPF^^P60XVvtVPF^F^P6+X^PPPF^P6X^P6sXX uPvYPvYPvY+PPF^P6+X^PPPF^P6X^P6sXX uPvYPvY Pv4v4h3FދF=~.FPvX4FPvX4Svދ ]h uH4P6^ u uDv v  Pv41^+^PvXPv4X^PvXAv v  Pv4A^+^PvXV2]nSPPR62DDDPPR64DDDPPR66DDDPPR68DDDP PmR6:DDDP PVR6<DDDP P?R6>mDDD]ZmPMDD3PPR60GDDD]9m3FF=|1P3FPt ^PDDPvtXV3P3PvK^;tVP&PvKL^;tV3PVvtX^ tPvpK^;tF u60 u AFAFv&P60Vz`P6&vV6PcVVF`PDD^ tP&PvP66XPvXv DDv#DDFPvtF^+^+PFYFvt^+PvtXPF^# u vDDvDDvtvt$Cu  a_m. x+]0+ stP/NDD]_F^;t3 PF^;t PFPNPFP=PF^;t3PF^;tPFP PFPI PF^;r%v^@PF^PvXv3FPvXv3FPFPG PF^;tP Pz8Pv4X^PvXAvv Pv4^+^PvX Pv4X^PvX]gFPF^;r2FPPF^P6;XPv]kg3PvD^;t P=DD]vqDDPvtY+vDDv{DD]gQFP6)X4V DDDv3PPQPCDD]l 3FF=|3F6ovPvX^;rPvX^P67XvP63vPOQPvX^P6sXv u4PPvX^P67XvP63vP1PPvX^K^;tC!VP;PvnK^;tvxDDF um]vuJDDPHHDDFP6VP~RPPG3]Ë]q3FF;0|60v3v3FF=`|66v3v],q P(HDD3tPNDD3]Ë]wvtvt$vvtYvvtYvtvt#]vF u PWDD]v F u6F;F6FFFPDD u3VvDD^;t@FPv3P uF uPPl8PF^;t,P8DD P8DDPF^;t Pf8DDP P!8PP8FP8DD]a PvD^;ƸtHPPv^;ƸtH^# u F^PvD^;ƸtHPPv^;ƸtH^# u F!3Pv^;t PPv^P6$XX+VvD^;t Pr=DD]vDDPvtYvsDDvDD]fPv^;t P =DD]vDDPvYvDPPPv^P6$X^+PXPvtXvDDv~DD]f3PP67XvP63vPv)v FP6a^ƉFvVvVvVvVVF^ tPF^PVF^ tPF^PVF^ tPF^PVF^ tP6PvX^PF^^+PVF^ tPv^PF^F 6RVPQ6R蔙DDPP,RFPF^;t 37]UvVDD^v3v3vvVDD uDFFPvV DDvVL DDvV= DDvV DDF u4PPDD6(VPP6(SDD u3]ÊFPJDDVFP6VPVPP;LvLDDFP6?X uv3FPDDJFPDDFP6VPhV&FPvMFF=tvMDDFF=t.FPDDFP6VPVPKDD3]Í6FFvDDvDPvDPEPPvD^P^^+ƈF3Pv^;t v,3FFPF^;rYPFPF^^PPv^P6)X4XPPF^PvXXvPF^PvX3aP&7DDFv^;t PP6Vu6 16 263P)DD VF^ tP ^PF^+Ɓ@FFP)DD]RPa*DDPvX^P<^ƁFPvX^Px^ƁFvFPFPvvvFPFPP)DDqP@)DDPP]R+767PvYPvY+vvLPr/DDP.DD]WyPX/DD{PN/DD]WP=/DD]W6 u, uPvY%PvY P-DDP`.DD FP-DD FP-DD]:W xP<PxPP6X^^PvtX3PvD^;u vt]\ 6 u FFvtvt_FPvtF^+^+PFYFF5Pvt^+PvtXY#vDD]T\PvX^P<^ƁFPvX^Px^ƁF7v7P7^ƈ73FP7^PPv^P6x;XXP7^PPv^P6x;XX7 u*P7^PPv^P6x;XX7 u*P7^PPv^P6x;XX7 u*P6VPbu3FF=|6ƄvFv@P6P6Vp3FF=@|60v3v6P60X u6 66363FF=Z|!FP6 u P )DD P(DD]QPp)DDP(DDPy(DD3Pq(DDPh(DD3FF= |PO(DDv]Qy%]Ë]QFv u1FPv^;tF]Ívv3]Ë]-Qv u vP<^PxP<PZP6X^Px^P<PYFF;~TxPPvX^P<^P 6^Px^PPvX^P<^PvFF;~TPvX^Px^P<PPvX^Px^P6^P<^Pv uPvYvvSPy3DDPo3DDP2DDP\3DD][6 u FFvtvtWFvtF^+ƁPFYFFPvt^+PvtXY vDD]8[PvX^P<^ƁFPv7^PPv^P6x;XXP7^PPv^P6x;XXP7^PPv^P6x;XXP7^PPv^P6x;XXPv^P6x;X3P6;XFP6;X6;6;36;X3v64XZP6X3FF=Z|6ƻv3v6366z63]K3FF=|6vFv60]OK$BBPvXvݸVv3KPFPysP/zDDPvXv]Pv u v u2vPv^;u3]Ívv]Ë]PvFPxV3PFP(F^;uF]ø=PFPxvFPwV3PFP(F^;uF]ËP6j;X6VPxF6 u FFv uFFFFFFP,DD3FF;|LvPvX^P<^ƁPvPvX^P<^Ɓ PvPc,DDPY,DDv;Pv,PvP6X^P<^ƁPX^Px^ƁF uPvYvv=Pc2DDPu1DD]Z3FF= ~vtv3v]ZP P!P2DD6 u:IFF u7PvY PvY+ 'F5FP,     7P6;XPP7^P6; XXPP7^P6; XX7 u PP7^P6; XX7 u PP7^P6; XX7 u PP7^P6; XXPP7^P6; XXPP67XtJX3FP^PPF^PYP7^P67XtPDD PxDDvDDFP uH4^# u dPDDdPDD P0DDvDD] u0vDDDPPdPmDDvCDDPPaPPDDvHDDdP>DD]+PDDYPDD!vDPvDPPDD3FvDXPF^;vSPF^PvtJXPPF^PvtDD])3FFPF^;rFPDDv]i)FP DD]T)PF^;ƸtHPPF^;ƸtH^ uFPPhAIDD6 u]Ê uF u] ]YP7^P67XtF7PDDFPF^;t]ø PF^;tYP7^P67XtPF^;uYP7^P67XtP6 XYP7^P67]ø9PF^;ƸwHP0PF^;ƸrH^ uPpDD0PF^+ƈFFPPDDFPF^;t]ø PF^;t F]øPF^;t 3F69PF^;ƸwHP0PF^;ƸrH^ u PDD,0PFX+V P^+ƉFF=};PF+FPPDDFPvX4VDDv,] uPFP|PDDPPF^^PFPS3FF= | 3PF^;uvPFPdP@DDP7DDPPF^^vt3FZvDPF^;u!FPvbvDPvPPDDF]Ë]#PPz/PDDYPF^P67XtPYPF^P67XtXYPF^P67XtPYPF^P67XV PYPF^P67X=FPPQA=](v uA Pv^;t P_DD PVDD vPFDDv](v uvPDDv]o(v uA Pv^;t PDD PDD vPDDv](XtP[P6 VX<\P6 VB<FP6 V,<0P6 V<" 7P~GDD]YP7^P67XtF7PDDFPF^;t]ø PF^;tYP7^P67XtF^^ƈFFPDD ufFPF^;t]ø PF^;t F]øPF^;t3Fn P(DD]YP7^P67XtF7PDDF PF^;tPYP7^P67Xt^;t'PFPFP3FF=^| 3PnF^;uvPFPdPDDPDDPPF^^PFPjF]Ë] ujv FDDPvP}FDDFYPF^;tYPDD]øNPF^;tNPDD3]øPVRDDF^;uPF^;uYPF^P67XDFYPF^P67Xt PF^;trYPF^P67XtFFPYPF^P67XtXFPF^;u!FPYPF^P67XVFPYPF^P67XVvv4Vv-LPvX^PvYv43]'=FvVvvV|P-=PDD]'PF^ƉF3VvvKF^;|FF]Ë]z'3VPv@F^;|FF]Ë]E'F=uv?DD]0'PvX^晉VFPF^;uPYP7^P67Xt^;t63<PYP7^P67Xt^P6X67PrFDDP6 uH4^ u]Ê u u] ]3YP7^P67X^;u63P6j;XP6j;X6j;VP u6V@DDPPFPF^;t;9PF^;ƸwHP0PF^;ƸrH^ u PDDFPDD6?DDPP PF^;tPDD] Pvw]Ë]PYDDP6j;XFP6j;XPXDD6j;VPz6EEDDPPPDD]FPF^ uFP^# u8vDDDPPdPIDDvDDDPPF u F]Ë]" u FF3FFP6;XVF^;r0-PFP^PzP/DDvPP6;^+PCLPPPPP7^P6;<X^PLPP|]vvvvDVFvvvvXZ^_;u;u]ø]Ë]&PvX^Fvvv KFF;Fu FFF]Ë]&PvX^FvvvOFvVvX^;u FFF]Ë]6&F uLFPP.     tF7PMDDFPF^;t]ø PF^;tjYP7^P67XtPF^;u@YP7^P67XtP66z66363R6636)6v4X@PvXvvW PviX uPv@X u3PvVPvYF uvm~rv[vaF]Ë]dF FN5v/X u"vJ~#vƸ-F=|tt4^XZ[YU]MQSRP_D3۹%uPPP8PRS3PD%-?=#=|)D-8yT\D 3E_Xˎ& A.2 UWFVv~ u y ؃ y ރS 3SN u]ÍwP DD6 u PDD4PDD6 u PDD PDD]P6j;X6j;VPQ u6/DDPPFyPF^;ƸtHPYPF^;ƸtH^ u]ønPF^;ƸtHPNPF7^P67Xt^;t u P6j;X"P6j;XP]DD6j;VP6"DD uR3PJPDD u$666366366673{ k uH4PP6 uH4^ ^ uD u u(7P6;Xa  u8P>BY u 7PKDDD7P?DDD]KuP;P8P uH4^ utvƸ0vƸ.vvYF=|vvY+3F3Vv^;|vƸ0rv}FF0PvXVXvvL`~Nv, uF uvƸ.v, uIv;w r;w+@N^Yt tu t؃FV _] v UF fF FfF FfFV ] v ûWg؎Ћ&>>@O9gs 3  UF t5x t/PV±$'@'Nu^;ƸtH^ u3]øPDDh]ËGtw VU v2F%1FF0CP3PPP!FV^ t؃]^Ëܸ1GVUF tFuv~vv~~D+EtyEȻYKKyً3x CC$CCP?DDP{DD 636 u=bP6j;X6j;VP6bDD u PLDDPDD6 uH4P6^# u^3PYP7^P67Xt^;u7YP7^P67Xt3YP7^P67XVSDDYPP;P7P;P7YP7^P67XtF7PDDFPF^;t]ø PF^;tYP7^P67XtPF^;uPYP7^P67Xt^P6;XP6XUP6^;t u5FF0PvX^v"vG~v3VF+F ^ t3]Ë]v u%Pv^;tF-Pv4^;ƸtHF u vvF0PF^;u F*Pv^;tv 4XF 9nvnX&^3^.U+;&v^.PF^;r PvX^P=^ƉƋ4F uF]øP PPD]3FF6WvQ~YX uv:f~?3F> vX u3]ËF=|3E y3CC1W^~FuF]^^XZ^X33SS^XZ^X3SS y ؃πRP0CPSVWW^3؎W_E %E%] VW_^D %  DEËE E E E uE7E tm ]]]]E 7^P67XtPF^;u7P=DDPKDD]ÊFPYP7^P67XtXYP7^P67XVDDw] 7PPbB u 6]` 7PP4B u 6]2 7PPB u P6j;X"P6j;XPDD6j;VP6"DD u4PtSDD u6*cvW uq@ 6*7P|BDDPDD,*P6^;ubJ u m6*7P8BDD*P6^;uGP6j;X6j;VPvF3FvPRDD u-0PvƊX+V PvX^^ƉF.Pv^;ƸtHF uv*Pv^;tv 4XFvF3FvPDD u-0PvƊX+V PvX^^ƉF3FlPv]ËF udF=FP(~v, uFFvv Pv},X u Fv, ukPvYFP6X:v4X u5FP64XF "PvueUUU )]WUFtF uv~JyvDv~;3SSSSSS_Nj, . t. .CCsCCt֋F-0@FFދF3FF܋!~]_" " " " WUF uv~FuF 6] 7PPA u 6]7PPA u 6]FF=~[PDDvF6PvX^;vXPcDDv]I uMCP8DD uIP!6DD u M3P^DD*P6^;tYP7^P67XtF;P*P)PYP7^P67XtXYP7^P67XtPF^;u[FPYP7^P67XVYP7^P67XtPYP7P!DD^;ƸtHF u vvPF uFF Fv~FF 3PvV!F޸gPv^;tF=|F=PF^PvVPvދYvP\Pv)P\^ƉF܍v܋ƸEF=|vYP9vX u Fv, ukPvYFP64Xv8X u5FP6XyFqwPvY+PvHX u# PF.C4v,3Pf~vFvFFF F} vi[Y3PPPPQS vT5Qv~;rwNNOOv~FFGGvFFYċF-?)FF1F~Cv~]_ ܊o w y2y:}ĹW9Wu KK$t w$t$t2 ܉G_tDD܈FPF^# u 3]]/FPF^#ƈFF]Ë]z u"6 u UPDD6 u UPDD]r6P*gPdDD0lPWDD#qPJDD]^P67XV37P@DD] P6j;XPlDD6j;VP] YP7^P67XtF7PDDFPF^;t3PYP7^P67Xt^;t33PF^;u636*PYP/     ܋Ƹ-F؉Fv܋Ƹ+v޸PvU\Pp DDF썆\FF uFF Fv~FF 3PvVF޸PvދF^^PvVPvދYvFށP\Pv*P\^ƉFܸgPv^;t=0Pv܁,tYv4VvX6464^X+VPvtX^PF^Ɓ^;t#PvtX^P6Y+3PvX]FP0^;ƸvH uH uP9PF^;ƸvH uHPX]Ë]cvuDDFPvtX^# u 3ҋ]øPvtY#F Pv_RPv4t!XZTPZv4V"PA u@PvtY v4XIPvtY#]UNV]vvX^Fv F uPvvF]Ë]fPF^P u]vYFPvtX5^# u v4vtX^# uvttXZ uv4t!,\t4XZvtVP!v4V!PFPYPF^;|1PvVvt^ƉƊ^;t v4XPYPF^+ƙRPvtTY[ӉTF]ËF u#v4 u v4VvPvXF҉FЉFθF̸FPv4^^ƉFv4,X uv̊ u<Pv̊^;t F́F<>Pv̊^;t F́FFPv4^VF^ƉXF=}P P Pv̊ uv́4Xv,4X4^;t v3.Pv܊^;tv3\PwDDF썆\FFF9FF*F FFF FFދF u)F Fvt4vXZTFF EF=|v 4XRPvXZTv 4X3RPt XRPvvvtt XZ^_^_׉VFvvXZVFvt XRPvtt XZ^_RPvttXZ^_;u;r*vt XRPvtt XZ^_RPvtXZTvvvttXZ^_׉VF3ҋ]aNvt X u$vtt vVvt u vtVvPPvX^P=^ƉX]Ë]Pvv^]Ë]FF=|0vV=^ƉƋ4 u vv4Xv]ZPF^+PdFPvtX^# uO PvtX^# ]Ë] PvtX^# uPvtX^# uPv4^;tqvtvtV P PPvt Pvt^Pvt Xvt XPvtX hv4VDDPvtXPvtX^# u Pvt^;tv́4X+ F̸>PvЊ^;tvЁ4XF̸PPv# ^;uPvv ^;uPPv ^;uP PP2)PFԉXFPvP ]YFFF=|,vV=^ƉƋ4 u vvXZTvލ\Pvt4F u2\F3RPvt4XZ^_;u;r v܁vODDFF uPvXVF^;rbPF^PPvX^PPvX^PF^Ɓ^+Pv}0PPF^+FPvbPF^ƉFPF^PPvX^PvXZ^_;u;r9vt XRPvtt XZ^_RPvvXZ^_;u;sR PvtX^# uvuDDRPvvXZ^_##RPvt XZTvt 3vlDDvtt vvXZ^_+RPvt XZvt vt X^;vt vt XvvXZ]Ë]u vPv4VPI^;@PvtY @PvtX^# uPPX]Ë]FFFv uv4^PdFF uFPvY F uFF uFPvY vt vt  vt ]øRPvtt XZY[5RFZ3FFF=|vttPvX^RPvtt XZ^_^_;u;rPvX^Pvt^PPFF3RPv4t!XZTPZv4V!PFF=t F=4XF=tPPTFF uPv4X5^#PvtXPvS^;:PFƊ^;tFFF=|5FF=|@vVPvX^Pf^ƉƉ^ƉƊPvVF^ƉƊPX^;t v4XF=t*PvX^PF^^+ƁPPvX^PPvX^PF^^+PPF+F^PvX.\FvIDDFv 4XFv*DDFF uF;FrFF3Ftv FܸF3FZFFܸF3FFCcsdDxXuUoObBfe*FP!PF^ƉFXF =|RPvvXZ^_;u;r FvvXZ؃VFRPv XRPvv9XZ؃RPލ^YƉƊPv,4^XF ؙRPFu5XZU ujvvXZVF3RPv X3RPvv[ލ^Yawrb _FPRPFFPvFF=u F=t3PFFPvXFVF=tF=uPRPvF=u F]ø]Ë]DPvY+v4VF^;u+P t-3PPPvX^Pvt^P3F F u vF u@PvtY PvX^Pvt Xvtt vttXZ^_+RPvt X^_;u;w&vtt vttXZ^_+RPvt XZ]6 PvtX^# ugvPF^#PPvX^Pf^ƉƊD^;tPvtY PvX^Pf^ƉƊDPvXPPvtX^#^;t3Pv4^;tPvtX PvtX PvtX v4XPvtX5^# uvvPvX uF gizog\TIA6.3F uF;FwF u-Pv܊^;t 0PF^;t,Pv4vvЃv,v,vVv,^;wPvVvvЃF;FwvvY+3FvvvvЃF uF ƉƊPv,4^Xv X3RPFu5XZU uF u-Pv,4^XP!PF^+F^ t3FFPvvF]Ë]P%PF u:PFƊ^;tIvP]FF=A}F=P~F@PvXPdPDD6=Fv4 uvVv4^;rFFƋ4Fv4VvXFPvXPvtX^PvXVF^;t+PvtX^PvtYv4VvX FFFFv4FPvtX^PvXVF^;t(PvtX^Pvtvt X^;|Pvt vt^ƉXvt XRPvtt XZ^_RPvttXZ^_;u;r.vt XRPvtt XZ^_RPvtXZTPZFvt PYPvX^^;|PYPvX^Pvt^PPvXRPPvtt XZYz^uv4VPVPv4VFP?^;PYPvtXvtPvtX ufPvtvtVFPvV=^ƉXPvtX5^# u F uv4V#PPv4t#t!XZY[RPvtXZTPZPu(v, uPvVvvЃvPv4vvЃ]4F̍v4^Fv4,X ux Pv̊^;t Pv̊^;t PvX6APv̊^;sZPv̊^;v Pv̊Yv́4Xw0     gPvY P PvtVvVPvtVF uvVPvt V( uF]vc]Ë]v4Fv udv4^PFF=.t:F=!|]ËF uv,4XFPv4^Xe too big.Can't read character set. This is a FOX.User language is the wrong size. I can't read it in.Please wait.There is no user defined version present.Do you want to read one in? (y/n) Couldn't read information from that file.Do you want to re. or press ESC to abandonYou have asked to start with: Please confirm (y/n)Couldn't load up language. Do you want to continue? (y/n)CURRENT CHARACTER SET IS: DEFINING CHARACTER: ASCII value: FILL or BLANK a cell ---------- Number Paeate cha set goodbye CUST3.OVLCUST3.OVLCUST4.OVLCUST1.OVLCUST2.OVLCUST5.OVLCUST5.OVLLANGUAGE.CSTLANGUAGE.CSTA:LANGUAGE.CSTCUSTOMIZ VER%s %s%s %sCUSTOMIZ VERU* DEL%dCHARSET.CSTU*None%s%c%s%x CUSTOMIZ VERHex Val:<>?+*}{`=|~_SPAC]Ë] ؋vPv^;t+v4^ u]Ív4XvPv^;r]ø]Ë]FFv4^Pv4^X uF]Ë]iv4XFv4^ uPF+F^ t3]Ë] ׊FPAFPvX]Ë]PPF^^#ƉF6=Fv4F uvVvtX^;sPF^PvtX^;sMPvX^PF^ƁFv4VvXPvtX+F^+PvtXFPvX vtXFv4VvX FFSF uPF^Pset keyboard to standard layout. Please confirm (y/n) Leaving this routine without saving to file. Please confirm. (y/n) Do you want to end this session without saving keyboard setting? (y/n) WARNING! Redefining this key disables a command key. Proceed?d 5 or SPACE BAR. MOVE cursor ------------------- Number Pad arrow keys. LOAD grid with a char --------- F2, then character. CLEAR grid -------------------- F3. Change DECSENDER LINE --------- F4.RETURN - to ENTER this characteESPDELDL%02xCharacter looks like this >A:<>=,:;*?&![]()/$^A^B^C^D^E^F^G^H^I^J^K^L^M^N^O^P^Q^R^S^T^U^V^W^X^Y^Z^[^\^]^^^_ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z { | } ~ _ a b c d e f g h i j k l m n o p q r s t u v w x y z [ \ ] ^ DEL^;~ ZPF^;~ PvYF]Ë]֊FPa^;~ zPF^;~PvYF]Ë]vփFPvtX^# u7P PP!փPvtX^# uwFvVvX^;r^ Pv^;tPvtX^# uF u%FPvtXFPvXPvYF]Ë]U؎v~N;rNO]۸PvvT]Ë]vDDFPvtX^# u1P PPDD3FvVvX^;r3VvDDF^;|vƋFvPv (y/n) Do you want to set up this definition in keyboard now? (y/n) PRESS: F1 - leave routine F2 - start over F3 - abandon F4 - save to fileRE-ARRANGING THE KEYBOARDAll keys have REGULAR and SHIFT values.Alphabet keys and some characters also havr in table.ESC - to ABANDON this character.Should I save to file Can't find needed character set in CHARSET.CST fileDo you wish to use the currently loaded user language?Read from file Couldn't read language from that file. Enter na = ` + * < > ? ! " # $ % & ' ( ) SPACE - @ ; : , . / 1 2 3 4 5 6 7 8 9 0 Enter a brightness level from 1 to 15:That is not a valid intensity level.Level - Show that setting on screen now? (y/n)Extra (80 x 26) You have made changes which you haven't  Pv4V[v4^Pv4VAv4XFvVvX^;rX Pv^;tPvtX^# u v Ptvv4^P]v4Xvt vt X^;vt vt X@PvtX^# uPFPX]Ë] ՋvtvtX^# uF=tvt ,v,nF= tR3VvDDF^;|JF= tv 0vtFPvtY F= t@PvtX^# uPFPX]Ë]LڸPvtX^# uPvtY#vD]Ëve CTRL (^) values.The Number Pad arrow keys move the highlight through thecharacter set at the top of the screen.Hitting a key (Regular, Shift or Ctrl) assigns the highlighted character to that key.Press function key you wish to To return to Funcme of file to read in or press RETURN to abandonEnter name of file to save to Save to file Creating new file already exists. Should I overwrite it? (y/n) Saving, please wait.nCan't write to file. See if disk is full.Can't find file named Do ysaved to a file. Do you still want to sign off? (y/n)Can't find overlay file Was unable to read language successfully.Should I load that language onto the screen now? (y/n) On logged drive can't find file: Enter character of drive to find file on t X^;}Ovtvt XvvtXRPvt TY[ӉTPvt XPvt Xvt X uPvtX5^# u3Pvt Xvyvt X u Pvt X PvtY FPvt 4vt^ƉX]t vt X^;} PvtX^# uvDDPvtX^# uOvtvt X^;t*vtXRPvt TY[ӉTvt 3vt X uvt 3viDDvt vt X^;}]Ëvt PvtX]Ë]364v2X+VFtion Key Menu press RETURN To return to Main Menu press ESC. create or erase.edit.DEFINING FUNCTION KEY: Use <-- and --> to move in string. Press RETURN when done, ESC to abandon. Before entering RETURN, ESC, <--, -->, DEL or @ into string prou wish to load in all settings? (y/n) Mark the items in the menu that you wish to read.Select 'Read and Return' when all items are marked.Reading in. Please wait.Failed to read entire file. Press any key to continue Can't read in function keys, tabl or press RETURN to give up Not a valid drive unsigned char. Valid chars are A,B,C and D.Press the key of character you wish to define. To END session press RETURN. To save to a file press F1.Choose what you want to use as starting languageMNGR This is cr^;s3]Í6464X^+ƉFv6YF]Ë]U؎~NF]vv4VvPvX^PvYPv4X]؍vVvvVP݃]Ë]oFFv4^ uv,4Xv4^Pv4^X uF1     ess @.To abandon press ESC or any other key to continue Keys used: Press ESC to abandon display or any other key to start display Bytes left in bufferRead in special function keys from keyboard PLEASE DON'T PRESS ANY KEYS No keys programmed. MS8SPjP`PoPZDDPpDDPgDDP<DD+9PP,]9]q u3P6oVG6o 06o 86o36oV^PG3FF=|63ƄvFv3Y!9N#F!O#!9~#fov^NO! 9^#VV`i#DM+s!<^NOOͤY! 9^#V)))_DM!9^#V!9^#V! ^#V! ^)`^#VͣYͤY!DM!9^#Vn&&CX$~Pn$&!͚^DM!9~#fo^O!9^#VBK!9^#VPPj  E { G  V #\+RciJV W'/ No ChangesReturn to Main Menu SCREEN AND KEYBOARD CUSTOMIZATION PROGRAM Ver Use Up and Down arrows to move through menu.Pr SettingsLanguage and Keyboard Function KeysUser Created CharactersUser Created KeyboardRead in Marked Choices^C >>> VIEWHAZ15REGENT U*CUST5.OVLCUST5.OVLCUST5.OVLCUST5.OVLCUST5.OVLBAD FILE$%03dcon: TOO MANY ARGS$wa9PTRShould I load that keyboard layout into the keyboard now? (y/n) Do you still want to leave this routine? (y/n) Can't find file on that drive either. CURRENT SETTINGSPress ESC to leave this menuNot a valid CP/M file name. Please re-enteFF=|63vFv630PP63VB u6 66363FF=Z|!FP6X3v64XZP6X3FF=Z|6ƻv3v\X!!9^#V`i͚^]! 9s#rz|P! 9^#V!9^#V`iͅS!9s#rz|P\X! 9^#V!9~#fo͚^]PYDM|yP!`i! 9^#V!]PYDM`i!9~#fo^P!9^#V`i͚^!9^#V`iPP\X`i\X!9^#VͤY! 9N#FRv^P!!9^#V!$ ess RETURN to select an entry.Press RETURN to select an entry. Press ESC to abandon this sub-menu.ABDHFGINS NO CORE$ $$@Y@@חA7yACnF?O8M30HwZ?sOu?{Gz?-C6?:0yE>ؗrw REDIRECTION ERROR$cFREE$READ$WRITE$4 pPiITTbdHRNEFEfDE "%Yn@|&~WwSMc`LUK:}A r nameMS96PTRMS97PTRMS98PTRManager CUSTOMIZ VER 5000FOX Program can not run on this terminal %cMAIN MENUBrightness Screen Type Cursor Type Screen Size Screen Emulation Function Keys Language K636[ u 6\z 6\x6]3]3PF^;t@3FF;Y|,vPvXvvvPF^;t3FF=|vv3vF3FF=|vvF3FFV""F=v4VDDF=3VPv4VGJ^;u3Pv4VFF=tv4VP|Ҝ<2#I9D "(.4:  N SIZE Small (132 X 50) Normal (80 X 24) Extra Lines (80 x 26)SCREEN EMULATIONS ADDS Viewpoint ADDS Regent 2025 Hazeltine 1500 FUNCTION KEYS Create/Erase a StringEdit a String Display All Keys Read Present SettingsLANGUAGES AsciiFYFvPFYFv_]*P63^;t]øUP63^;t[1 u PDDPDD63PUDD63 u PDD]Ë]T6P6Z^;ƸuHP6X#Vv4V0Pg3PPUP63^;tVv3 DD^;t 63*63 u<63 u VvP DD^;u PDD PDD3PPPDD~3PNPv4V2H^;ƸtHPPF^;ƸH^# u([P!$ ^!9~#fo^!$ s{5N`i!~#fo#s#r!ͤY:4d©N!}23d!}25d}24d!3d! V! !V:5do&<^ʌN!}24d!:`o:4do#}24d&3d#s!"5e:4do&DM!9~#fow^N!9^#VBK!9^#V*5e3dMY`i*5e"5e`i:4do͚^}24d`i            ^|-[!Ha.l.Mb"`@e ' E d r 8  (American) British Danish Dutch French German Italian Norwegian Swedish User Defined KEYBOARD LAYOUTStandard User Defined SETTINGS TO READ INScreen and Cursor2     ^ u]Í6Z u u F@F@FPDDPVF^ t^PF^+PDDVF^ tPoDDP6Z^# u43FF;F|!6ZvPDDDvn3FF=`|^PPvX^P6ZXVvVvX^;u FFF]Ë]ËGtw VU v2F%1FF0CP3PPP!FV^ t؃]^Ëܸ1GVUF tFuv~vv~~D+EtyEȻYKKyً3x CC$CCC=|CFP66CXC;At6A,A=|A] }P3DD]Ë] P3DD]Ë] 3FF;F|PvX Pv^;t Pv^;tv3YPDDF]ø Pv^;sPv^;rPFPm83V^;uFPDDD3FF=|4PvvX/0Pvv^;t v3VFP=8DD^;tPFP u 3$ PFP_ u K u8FPF^# u36;u?3UP63^;t3P^;ƸtH63*]3]Ë]FF=~P DDvF6PvX^;vP DDv]e uMP DD uP DDFPF^# u 3FPE3FF=|vvPDDvvPDD3FF=`|6[vPDDv]F=t>PDD3FF=|!63ƄvP9DDvtF=tePDD3FF=|H63 uE y3CC1W^~FuF]^^XZ^X33SS^XZ^X3SS y ؃πRP0CPSVWW^3؎W_E %E%] VW_^D %  DEËE E E E uE7E tm ]]]]E uvPDDvvPv^;tPv^;tF=#v3v,v3'v, v3[PDDF]Ë]} PPDD PGDDP>DD]` 3FFPF^;rFPDDv]# FP DD]øP$P_M(]3FF=d|+7F3PF^;u F]ÍvF]Ë]_ uPDDFFPF^;vwTvF]Ë]GPDDYPDD PF^PDD PF^]] [FPF^#ƈFF]Ë]x u"6 u P DD6 u P DD]6P*P DD0P DD#P DD]8 u]ÍPm DD66vPDD63vPDDv]Ë]VP6Vv:^;tP6V  u(P6oV6V<6o uV6o46o4X^PDD^ tFVv6Vv^;toP6eUUU )]WUFtF uv~JyvDv~;3SSSSSS_Nj, . t. .CCsCCt֋F-0@FFދF3FF܋!~]_" " " " WUF uv~FuF] PF^;ƸtHPPF^;ƸtH^ uFPP"!W!FPP !W!]v uA Pv^;t P_DD PVDD vPFDDv]Wv uvPDDv])v uA PPDD] v u v u2vPv^;u3]Ívv]Ë] v u vP6DDPvXv]y vDDMPv ]Ë]^ vDDv~P5OP~P4V3P~Pz^;t u PP DD4PC DD6 u  P& DD P DD]PVF^ t^FF;FuPvYF]Ë]6 u6 u uH4P6^# u uH4P6V6o46XV#< P63V6o46XV<6o46V6o46XV;3]ø]Ë] u]þV3PV6o4X^ tPv^;t VP6Vv^;tFv u @FFF F} vi[Y3PPPPQS vT5Qv~;rwNNOOv~FFGGvFFYċF-?)FF1F~Cv~]_ ܊o w y2y:}ĹW9Wu KK$t w$t$t2 ܉G_ttv^;t PDD PDD vPDDv]vv4Vv+PvX^PvYv43] FvVvvVP  PDD]rPF^ƉF3Vvv+F^;|FF]Ë]43VPv\ F^;|]z%DDv~PX53Vv5DD^;u%TP~Pk4vDDv~PU4~P~PK5DDP][Y^A؎/ PP$F u0FP66AXV6A^;}3A]C A;Ct3F+66CF^# u]FP7DDFFP6X4XF6FFF]Ë]PPF^#^#ƉF PF^# uPvY@PF^# u<PvYv,F]Ë]MP DDFF=~3FF=|m6 u@FaPvYV3PV6o4X^ tPv^;tuVVF^ tP6Vv^;tDF`P6ZVP:`P[PF`P6XV:3]ø]Ë]F6o4XFF=tmV3PVFt4^XZ[YU]MQSRP_D3۹%uPPP8PRS3PD%-?=#=|)D-8yT\D 3E_Xˎ& A.2 UWFVv~ u y ؃ y ރS 3SNFF]Ë]F=uvDD]PvX^晉VFvvvvb$VFvvvvXZ^_;u;u]ø]Ë]PvX^Fvvv*FF;Fu FFF]Ë]>PvX^Fvvvw/FV6C^;}3CPF^;tVPDDDW!F]Ë] 3PF^;tF]Ë]  A;Ct3F+66CFV6C^;}3CFP^#Ƌ]Ë]L 3PF^;tF]Ë] 6C,VFFP DDF^;uvFFPU P VFF^ t^PFF^;t .PDDv PvYg]v*9DDF3PF^;t]ÊPHDDlP?DDFP4DDFP)DDvDD]C$PvXvݸVv3^ tPv^;tVP6Vva^;t!PPP93]ø]Ë]6P6Z^;uR6ZP6X6 u!6 u 63]3]Ë]-6P6Z^3     ;w r;w+@N^Yt tu t؃FV _] v UF fF FfF FfFV ] v ûEWg؎Ћ&>O9gs 3  MUFY t5x t/PVY±$'@'Nuӱ]Ë] PvtX^# uPvtX^# uPv4^;tqvtvtV P PPvt Pvt^Pvt Xvt XPvtX hv4VDDPvtXPvtX^# u Pvt^;tv́4X+F̸>PvЊ^;tvЁ4XF̸PPv# ^;uPvv ^;uPPv ^;uP PP2PFԉXFPv̓P ]YFFF=|,vVX!^ƉƋ4 u vXZTvލ\Pvt4F u2\F3RPvt4XZ^_;u;r v܁vODDFF uPvXVF^;rbPF^PPvX^PPvX^PF^Ɓ^+Pv}0PPF^+FPvbPF^ƉFPF^PPvX^P5FF0PvXv"vG~v3VF+F ^ t3]Ë]v u%Pv^;tF-Pv4^;ƸtHF u vvF0PF^;u F*Pv^;tv 4XF 9nvnXI&K^3^.U+;&Gv^.PF^;r PvX^PX!^ƉƋ4F uF]ø]P PPD]3FFWvQ~YX uv:f~?3F vX u3]ËF=|3vt vt  vt ]øRPvtt XZY[5RFZ3FFF=|vttPvX^RPvtt XZ^_^_;u;rPvX^Pvt^PPFF3RPv4t!XZTPZv4V!PFF=t F=4XF=tPPTFF uPv4X5^#PvtXPvS^;:PFƊ^;tFFF=|5FF=|@vVPvX^P$^ƉƉ^ƉƊPvVF^ƉƊPX^;t v4XF=t*PvX^PF^^+ƁPPvX^PPvX^PF^^+PPF+F^PvX.\FvIDDFv 4XFv*DDFF uF;FrFF3Ftv FܸF3FZFFܸF3FFCcsdDxXuUoObBfevF3FvPRDD u-0PvƊX+V PvX^^ƉF.Pv^;ƸtHF uv*Pv^;tv 4XFvF3FvPDD u-0PvƊX+V PvX^^ƉF3FlPv]ËF udF=FP(~v, uFvv Pv},X u Fv, ukPvYFP6X:v4X u5FP6XF "Pvt-3PPPvX^Pvt^P3F F u vF u@PvtY PvX^Pvt Xvtt vttXZ^_+RPvt X^_;u;w&vtt vttXZ^_+RPvt XZ]6 PvtX^# ugvPF^#PPvX^P$^ƉƊD^;tPvtY PvX^P$^ƉƊDPvXPPvtX^#^;t3Pv4^;tPvtX PvtX PvtX v4XPvtX5^# uvvPvX uF ugizog\TIA6.3F uF;FwF u-Pv܊^;t 0PF^;t,Pv4vvЃv,v,vVv,^;wPvVvvЃF;FwvvY+3FvvvvЃF uF P!DD^;ƸtHF u vvPF uFF Fv~FF 3PvV!F޸gPv^;tF=|F=PF^PvVPvދYvP\Pv)P\^ƉF܍v܋ƸEF=|vYP9vX u Fv, ukPvYFP6Xv8X u5FP6XyFqwPvY+PvHX u# PF.C4v,3Pf~vFvFtvt X^;|Pvt vt^ƉXvt XRPvtt XZ^_RPvttXZ^_;u;r.vt XRPvtt XZ^_RPvtXZTPZFvt PYPvX^^;|PYPvX^Pvt^PPvXRPPvtt XZYz^_v4VPVPv4VFP?^;PYPvtXvtPvtX ufPvtvtVFPvVX!^ƉXPvtX5^# u F uv4V#PPv4t#t!XZY[RPvtXZTPZPvu(v, uPvVvvЃvPv4vvЃ]4F̍v4^Fv4,X ux Pv̊^;t Pv̊^;t PvX6APv̊^;sZPv̊^;v Pv̊Yv́4XwƸ-F؉Fv܋Ƹ+v޸gPvU\Pp DDF썆\FF uFF Fv~FF 3PvVF޸PvދF^^PvVPvދYvFށP\Pv*P\^ƉFܸgPv^;t=0Pv܁,v4X@PvXvvW PviX uPv@X u3PvVPvYF uvm~rv[vaF]Ë]dF F 5v/X u"vJ~#vƸ-F=|RPv4t!XZTPZv4V"PA u@PvtY v4XIPvtY#]UNV]vvX^Fv F uPvvF]Ë]fPF^P u]vYFPvtX5^# u v4VtX^# uvttXZ uv4t!,\t4XZvtVP!v4V!PFPYPF^;|1PvVvt^ƉƊ^;t v4XPYPF^+ƙRPvtTY[ӉTF]ËF u#v4 u v4VvPvXlF҉FЉFθF̸FPv4^^ƉFv4,X uv̊ u<Pv̊^;t F́F<>Pv̊^;t F́FFPv4^VF^ƉXF=}qP P Pv̊ uv́4Xv,4X4^;t v3.Pv܊^;tv3\PwDDF썆\FFF9FF*F FFF FFދF u)F Fvt4vXZTFF EF=|v 4XRPvXZTv 4X3RPvtvƸ0vƸ.vvYF=|vvY+3F3Vv^;|vƸ0rv}FF0PvXXvvL`~Nv, uF uvƸ.v, uIv4     vt u vtVvPPvX^PX!^ƉX]Ë]Pvv^]Ë]FF=|0vVX!^ƉƋ4 u vv4Xv]ZPF^+PdFPvtX^# uO PvtX^# u 5000FOX Program can not run on this terminal %c.CMD ^C BAD FILE$%03dcon: TOO MANY ARGS$warw REDIRECTION ERROR$cFREE$READ$WRITE$T)pPiITTbdEFEfDE %YWwSHc`LUK:};~ ZPF^;~ PvYF]Ë]֊FPa^;~ zPF^;~PvYF]Ë]vփFPvtX^# uP PP!փPvtX^# uwFvVvX^;r^ Pv^;tPvtX^# uF u%FPvtXFPvXPvYF]Ë]U؎v~N;rNO]۸PvvT]Ë]vDDFPvtX^# uP PPDD3FvVvX^;r3VvDDF^;|vƋFvPvvXZ^_;u;r9vt XRPvtt XZ^_RPvvXZ^_;u;sR PvtX^# uvuDDRPvvXZ^_##RPvt XZTvt 3vlDDvtt vvXZ^_+RPvt XZvt vt X^;vt vt XvvXZ]Ë]* vPv4VPI^;@PvtY @PvtX^# uPPX]Ë]FFFv uv4^PdFF uFPvY F uFF uFPvY A *dummydummy Pv4V[v4^Pv4VAv4XFvVvX^;rX Pv^;tPvtX^# u v Ptvv4^P]v4Xvt vt X^;vt vt X@PvtX^# uPFPX]Ë] ՋvtvtX^# uF=tvt ,v,nF= tR3VvDDF^;|JF= tv 0vtFPvtY F= t@PvtX^# uPFPX]Ë]LڸPvtX^# uPvtY#vD]ËvFP!PF^ƉFXF =|RPvvXZ^_;u;r FvvXZ؃VFRPv XRPvv9XZ؃RPލB^YƉƊPv,4^XF ؙRPFu5XZU ujvvXZVF3RPv X3RPvv[ލB^Yawrb _FPRPFFPvFF=u F=t3PFFPvXFVF=tF=uPRPvF=u F]ø]Ë]DPvY+v4VF^;uP P^|- NO CORE$ $$@Y@@חA7yACnF?O8M30HwZ?sOu`?{Gz?-C6?:0yE>ؗҜ<2#I9ltlPYP>u2 P6]U졆H5t#V58VwVVu7]U45W<u:PAW< t@P>Wt@Y sI>W u P2>W u PI4uW< r<t,a<s&W_6W!661H9wl1 tj >tB >sg V PU ;r)u@s L P6 P P 1PX1 t6 T P k P6n o P 1P s P,uP> t@Y rP}LJ,Ps P 5>\ t@P>\,t@Y ss>\t P };r;vQ>usP~ Ƈ~>u ;vȀ>u +9w>uU>ugizog\TIA6.3F uF;FwF u-Pv܊^;t 0PF^;t,Pv4vvЃv,v,vVv,^;wPvVvvЃF;FwvvY+3FvvvvЃF uF Mu]U~ u~ u $~ r>rsF]Ut PBPX>u] P]U P| Pv]U Pk]U,P`]UF0PR]U;PE]UF t[F 1 1>t@"F`W뙠45764]U4XwXƇXum?$u2X>Xw&Xƻm,AY<s ƇXuӀ>e u e򤸀P\P >u P$P Pw897|XX<wƇ: ]UF1v uFFFF]Uv6 P@ v6 v@ ]U;P ? vk :P 0 v  ]UC ;P  P - P P P P s:PO P P <wiÊsW QP^ s:C>u3>u#> u>@u%>u >v>t;wZ>uUuvHs_㋇)sP Ρ ,>u%% u@P;w@Y syyXَэ&P +ɋUVN]0102821100654321Pw@Y"FsFs P6F 1F]U~ v F, AFF0v]UFPF$P]UFPFP]UvhPs]UFPPPdP]UvPP'P]UvPP'P]U7sE6s] ƇB XuƇ:$ P]]U>H u GNHoDPw]U8r38EPvV4*^ZZt P ?P]U~tv]U4:5r9s]Ê44]U^]s]\>\uZ>[ t>[u[4P P6C Pz P61 s:P[ P6  PM u P  P) C P/ 3 P : P +> P F P P[ Ps ]Us  P ]U>wƇu9r84  o P>\ tnw PMs|8s]Xs]À>uxsP s.x;P IP6@P62MP"P8P<PXP\PvPzP]À> s P ]á+@r3 s!;P6 PR6PD AU~ v FA, FF0vc ]UFPF$P]UFPFP]UF0P! ]UFd1PF 11RF 1R]Us v ,P :^w-ȴÊ_< s#P 6>6 uʰ:P 6\d6>5u]ð;P:5sȴW]U^?$t 7F]UvFPPPdPg]U)v]Uv]U> s;Pnv]Uq P]Ut P]Uv]Uv]Uvv]s\&s\>['u \[\9s P런r>[t2[^_È^v>\u]]ø P^[ [>\u>[$ts]뗀>\t >[$u[>s݀>[Ot>[Qu >[Hu>t[$>Bu X.  P P|+ Pp Pd 8 >\ t P+g]U1]UPFP]U P P]U Pv]Uv]UPv]UPv]UPv]U&;P >t 6P:P l PQ >t&&PP6P6 Ps>v @A&60 PAPA P6Q P6a Py>us 6r PY>\u,Pt 6)HPg 9sP ]U\:Fu]UƋ^u \:u۰]U>\ t@ 9]Usx]UsP$P]]U>u>\u>t>v&PS #.PD5PUvv]U>\t>\u]À>\u>_;u >_ t_\]À>^v]Ê^㋇x Ê^ \>t[^w@˷_֋P:t@Y"sʈǂ>u]\^\]U[:Ft@s[] ^>Du^ :^wvȴÊ_t+袀sr@s\u>\u P\].>\u%>['u [<'t]À>[ u ! PZ]]Q]U[,0< vPv]UPv~]UPvn]UPv[]UPvK]U@v[]U9s]á@=vD>s0P\P_tƇЁ]US<u9S]UTTȢTvs 6 PHP PhHP P\P PbP PW1P P26 P'! P6 % P sP ) P < P s$P9P{:vWQP"s:Pr[PPZP:_P2QP)?PoP6|PPPPPPPPPtS]U츺Pk ]U> wƇu\6     P,uPjPPÙ>tPfjƇjj]Uz|~$%|>wLJuxp<uAPPnt>uJt>tt4t"<uu&PPePaP$㉇J.t$>t;~te9~u@ÈPv@Y"rP>ttB~ȢP [JjP Yi.t뷀>u .t6t~<w3 ÃjUPP]UHĸpn@j\PP!P*PPPPw>uP(PePP\P\P\PF>u\P=>u-PV@]U]nt, Command Form is: GENDEF x $ Where x.DEF Holds Disk Definitions With Optional Parameters : C: Create Diskdef Comment O: Generate Offset-Relative Labels Z: Z80, 8080, or 8085 (else 8086, 8088) x.LIB is Created Upon Com @?End-File$offset $bad val$dpbase$equ$Base of Disk Parameter Blocks$dpe$xlt$Translate Table$Scratch Area$dirbuf,$dpb$Dir Buff, Parm Block$csv$alv$Check, Alloc Vectors$range $equ$ diskparm$delimit$missing$numeric$duplict j%1jnunuƸiPPP<P\PtmP.%P]Up@;v P Fn6p]Up@;r@"sn6pp]UP6xP6pP1x;ps u!n6xUPFP]U P P]U~ v FA, F0P]UFPF$P]UFPFP]U Pv]Uv]UkPvsP6pJ]U츃P]UPv]UPv]UPv]Upletion. $Premature End-of-File$Length $Convert$Quote $ LIBno ".LIB" directory space$".LIB" disk full$cannot close ".LIB"$dw$db$ DISKSENDEFMACLIBDISKDEF $Alloc $no disk$Disk $ is the same as Disk $dpb$Equivalent Parameters$als$Same Allocation Vector Size$css$Same Checksum Vector Size$xlt$Same Translate Table$too few$Disk $ is CP/M 1.4 Double Density Compatible$65536$128 Byte Record Capacity$Kilobyte Driv0=x P]U6x7:P P]U6\Ptm%]U@|@;w ]UK&&]UtHtt Ppp;|vH|]UPPZPYp]U'>'w'(t'Pv]UPPz]UPvi]UPvY]UPvI]UPv9]UPv&]UFȈF'w;!<w!'طM:(t!u؀>!t뷰]à'1]U..:Fwt.u]Ulm6l< tl]UP> u]I0s>]t> ù>0u뿀>0 sf_F]UP> t]UFN ]U>w:fu]u]UF,0< vF,A<vF,A ]Ur6s(6jwB 1$Directory Max$Alloc0$Alloc1$Check Size$Offset$xlt$equ$No Translate Table$Translate Table$als$equ$Allocation Vector Size$css$equ$Check Vector Size$ds$rs$Uninitialized Scratch Memory Follows:$begdat$equ$Start of Scratch Area$dirbuf$Directory Buffer$alv$al7     u]U3>3w1s 3Ƈ5 35P3u042>0 r@"4sW211<v@"2s'015:t21Ǡ2s40뗠4s00]U>]u@P> u@Y"sp>&^3^.U+;&v^.PF^;r PvX^P^ƉƋ4F uF]ø6P PPD]3FF9WvQ~YX uv:f~?3FA vX u3]ËF=|3]ËF udF=CC1W^~FuF]^^XZ^X33SS^XZ^X3SS y ؃πRP0CPSVWW^3؎W_E %E%] VW_^D %  DEËE E E E uE7E tm ]]]]E ueUUU )]Pw@Y"FsFs P6F 1F]U~ v F, AFF0v]UFPF$P]UFPFP]UvhPs]UFPPPdP]UvPP'P]UvPP'P]U7sE6s]AuP0 Ylƀ>Mu(hP0 Yn0P0 Yi뗀>Xu9P0 Yp4]FP(~v, uIFvv Pv},X u Fv, ukPvYFP6X:v4X u5FP67XF "PvYP9WUFtF uv~JyvDv~;3SSSSSS_Nj, . t. .CCsCCt֋F-0@FFދF3FF܋!~]_" " " " WUF uv~FuFFF F} 6>5u]ð;P:5sȴW]U^?$t 7F]UvFPPPdPg]U)v]Uv]U> s;Pnv]Uq P]Ut P]Uv]Uv]Uvv]vX u Fv, ukPvYFP67Xv8X u5FP6XyFqwPvY+PvHX u# PF.C4v,3Pf~vFvFv4X@Pvi[Y3PPPPQS vT5Qv~;rwNNOOv~FFGGvFFYċF-?)FF1F~Cv~]_ ܊o w y2y:}ĹW9Wu KK$t w$t$t2 ܉G_ttt4^XZ[YUUvv]U>\t>\u]À>\u>_;u >_ t_\]À>^v]Ê^㋇x Ê^ \>t[^w@˷_֋P:t@Y"sʈǂ>u]\^\]U[:Ft@s[] COPYRIGHT (C) 1982, DIGITAL RESEARCH [], ERROR: $, LOAD ADDRESS $DISK WRITE$DICODE DATA EXTRASTACKX1 X2 X3 X4 8080 NZERONHEADCGROUPDGROUPEGROUPSGROUPvXvvW PviX uPv@X u3PvVPvYF uvm~rv[vaF]Ë]dF FQ5v/X u"vJ~#vƸ-F=|tvƸ0]MQSRP_D3۹%uPPP8PRS3PD%-?=#=|)D-8yT\D 3E_Xˎ& A.2 UWFVv~ u y ؃ y ރS 3SN;w r;w+@N*3F PCPPPP* P*DDF=} v2PP]UfN V N]6V*DD6SK READ$INSUFFICIENT MEMORY TO CREATE CMD FILE $LOAD ADDRESS $ERROR ADDRESS $BYTES READ:$RECORDS WRITTEN $ABSCANNOT OPEN SOURCE$CMDNO MORE DIRECTORY SPACE$CANNOT CLOSE FILE$vƸ.vvYF=|vvY+3F3Vv^;|vƸ0rv}FF0PvXYXvvL`~Nv, uF uvƸ.v, uIv5FF0Pv^Yt tu t؃FV _] v UF fF FfF FfFV ] v ûWg؎Ћ&>O9gs 3  UF t5x t/PV±$'@'Nuӱ 9nvnX4vv]Ë]ËGtw VU v2F%1FF0CP3PPP!FV^ t؃]^Ëܸ1GVUF tFuv~vv~~D+EtyEȻYKKyً3x CC$CCE y3Mu]U~ u~ u $~ r>rsF]Ut PBPX>u] P]U P| Pv]U Pk]U,P`]UF0PR]U;PE]UF t[F 1 1>t@"F8     Xav"vG~v3VF+F ^ t3]Ë]v u%Pv^;tF-Pv4^;ƸtHF u vvF0PF^;u F*Pv^;tv 4XFvF3Fv@PvtY @PvtX^# uPPX]Ë]FFFv uv4^PdFF uFPvY F uFF uFPvY awrb _FPRPFt  vt ]øRPvtt XZY[5RFZ3FFF=|vttPvX^RPvtt XZ^_^_;u;rPvX^Pvt^PPFF3RPv4t!XZTPZv4V!PFF=t F=t-3PPPvPPTFF uPv4X5^#PvtXPv^;:PFƊ^;tFFF=|5FF=|@vVPvX^Pi^ƉƉ^ƉƊPvVF^ƉƊP^;t v4XF=t*PF^#PPvX^+ƁPPvX^PPvX^PF^^+PPF+F^PvX.\FvDDFv 4XFvDDFF uF;FrFF3Ftv FܸF3FZFFܸF3FFCcsdDxXuUoObBfegizog\P7DD u-0PvƊX+V PvX^^ƉF.Pv^;ƸtHF uv*Pv^;tv 4XFvF3FvPDD u-0PvƊX+V PvX^^ƉF3FlPvPuDD^;ƸtHFFPvFF=u F=t3PFFPvsFV.F=tF=uPRPvF=u F]ø]Ë]_PvY+v4VF^;uxP PPDD6Fv4 uvVvX^Pvt^P3F F u vF u@PvtY PvX^Pvt Xvtt vttXZ^_+RPvt X^_;u;w&vtt vttXZ^_+RPvt XZ]6 PvtX^# ugvtvt X^;|Pi^ƉƊD^;tPvtY PvX^Pi^ƉƊDPvXPPvtX^#^;t3Pv4^;tPvtX PvtX PvtX v4XPvtX5^# uvvPvX uF uv4VPVTIA6.3F uF;FwF u-Pv܊^;t 0PF^;t,Pv4vvЃv,v,vVv,^;wPvVvvЃF;FwvvY+3FvvvvЃF uF u(v, u u vvPF uFF Fv~FF 3PvV!F޸gPv^;tF=|F=PF^PvVPvދYvP\Pv)P\^ƉF܍v܋ƸEF=|v܋Ƹ-F4^;rFFƋ4Fv4VvXFPvXPvtX^PvXVF^;t+PvtX^PvtYv4VvX FFFFv4FPvtX^PvXVF^;t(PvtX^PvtYv4VvX6464^X+VPvPvt vt^ƉXvt XRPvtt XZ^_RPvttXZ^_;u;r.vt XRPvtt XZ^_RPvtXZTPZFvt PYPvX^^;|PYPvX^Pvt^PPvXRPPvtt XZYz^_RPv4t!XZPv4VFP?^;PYPvtXvtPvtX ufPvtvtVAFPvV^ƉXPvtX5^# u F uv4V#PPv4t#t!XZY[RPvtXZTPZPvtX^# uvPvVvvЃvPv4vvЃ]4F̍v4^Fv4,X ux Pv̊^;t Pv̊^;t PvX6APv̊^;sZPv̊^;v Pv̊Yv́4XwPvXEF҉FЉFv܋Ƹ+v޸@Pv\PDDF썆\FF uFF Fv~FF 3PvVF޸PvދF^^PvVPvދYvFށP\Pv*P\^ƉFܸgPv^;t=0Pv܁,4^;t v3tX^PF^Ɓ^;t#PvtX^P6Y+3PvX]FP0^;ƸvH uH uP9PF^;ƸvH uHPX]Ë]~vDDFPvtX^# u 3ҋ]øPvtY#F Pvt XRPvvvtt XZ^_^_׉VFvTPZv4V"PA u@PvtY v4XIPvtY#]UNV]vvX^Fvo F uPvv! F]Ë]fPF^P u]vYFPvtX5^# u v4Vvt uttXZ uv4t!,\t4XZvtVP!v4V!PFPYPF^;|1PvVvt^ƉƊ^;t v4XPYPF^+ƙRPvtTY[ӉTF]ËF u#v4 u v4Vv]Ë] FθF̸FPv4^^ƉFv4,X uv̊ u<Pv̊^;t F́F<>Pv̊^;t F́FFPv4^VF^ƉXF=}JP P Pv̊ uv́4Xv,4Xv́4X+ZF.Pv܊^;tv3\PDDF썆\FFF9FF*F FFF FFދF u)F Fvt4vXZTFF EF=|v 4XRPvXZTv 4X3RPvXZTvލ\PvvXZVFvt XRPvtt XZ^_RPvttXZ^_;u;r*vt XRPvtt XZ^_RPvtXZTvvvttXZ^_׉VF3ҋ]aNvt X u$vtt vvXZ^_;u;r9vt XRPvtt  vtVvPPvX^P^ƉX]Ë]FF=|0vV^ƉƋ4 u v,v4Xv.]uPF^+PFPvtX^# uO PvtX^# u vPv4VPd^;PvtX^# uPvtX^# uPv4^;tqvtvtV P PPvt Pvt^Pvt Xvt XPvtX hv4VDDPvtXPvtX^# u Pvt^;tvt v̸>PvЊ^;tvЁ4X\F̸P^Pv ^;uPvv ^;uP`Pv ^;ubP PP2vPFԉXFPvP ]YFFF=|,vV^ƉƋ4 u v4XF=tt4F u2\F3RPvt4XZ^_;u;r v܁vDDFF uPvXVF^;rbPF^PPvX^PPvX^PF^Ɓ^+Pvb0PPF^+FPvPF^ƉFPF^PPvX^PPvX^PF^^9     XZ^_RPvvXZ^_;u;sR PvtX^# uvDDRPvvXZ^_##RPvt XZTvt 3vDDvtt vvXZ^_+RPvt XZvt vt X^;vt vt XvvXZ]Ë]8*FP!PF^ƉFXF =|RP7'Ë2u1Ju t|{ à4$ut>Pt4 à$33tâڰSQRd(Y^& ËuCCCCCs~>nڋF<r&Y&o؊D [icPk$r8G uG tq|X<`u/P7rk$:rXutYðf&O&OAuis@r sð $$@Y@@חA7yACnF?O8M30HwZ?sOu?{Gz?-C6?:0yE>ؗҜ<2#I9S䂨uWVWVV䂨u 䀰悰>&5ItG&It G&iQ3Yn'ǜ63àtuqS[ruS~G [ZtֻN &u\uMUttDPuqttuq<t4<s>vt's0U<u G :u G 8ruG 8suUr>vtlOhOaq<upP<u?^P]v4Xvt vt X^;vt vt X@PvtX^# uPFPX]Ë]؋vtvt X^;}Ovtvt Xv<vtXRPvt TY[ӉTPvt XPvt Xvt X uPvtX5^# u3PvtPvtVF uvVPvt V( uF]vc]Ë]v4Fv udv4^P%FF=.t:F=!|]ËF uv,4XFPv4^XFPvX]Ë]PPF^^#ƉF_YX3 System call made is implemented on the DMS-816 only  tþ t8QV<ZYQ t-RQYZ u#>u YZ+ы3Ì>2þËbôw؃' tu uڹMD[V] PIP $1:LOGOUT.CMD=$2:LOGIN.CMD[V] ; THATS ALL FOLKS yor&3o؎ŽعLsuÌڻgs o1PX:u6s.rw:O u :o u:W t <u :vtvG M> ûw8G uG ÉÉø6}fXHHrmsOt S[Cò2VWF77 mu[_^à Xvvt X u Pvt X PvtY FPvt 4vt^ƉX]6Fv4F uvVvtX^;sPF^PvtX^;sMPvX^PF^ƁFv4VvXPvtX+F^+PvtXFPvX vtXFv4VvX FFSF uPF^PF u%FPvtXFPvXPvYlhj VW‹Z _^‹ٹw&CC&؎‹G 5G5G 58@HPX`dhlptx| X t$ott u >uà}àSR@xs uZ[ ÌڻZ[SR5st uNEȰDZ[3ø t?u[Sw˷㋟[ڹ$Q0=9vGY؎<uäMQR>&HiNet Login Version %d.%d%c%c Please stand by .. BAD FILE$%03dcon: TOO MANY ARGS$warw REDIRECTION ERROR$cFREE$WRITE$M NO CORE$F]Ë]U؎v~N;rNO]ۍvVvPd,P]Ë]64v2X+VF^;s3]Í6464X^+ƉFv6YF]Ë]Ët T\DU؎~NF]9vv4Vv2PvX^PvYPv4X:      0dfh modrm 5,src endm codemacro FILD src:Mw segfix src db 0dfh modrm 0,src endm codemacro FIST dst:Mb segfix dst db 0dbh modrm 2,dst endm codemab 0dch dbit 5(1fh),3(dst(0)) endm codemacro FDIVRP dst:Db(0,7),src:Db(0) db 0deh dbit 5(1fh),3(dst(0)) endm codemacro FIDIVR src:Mb segfix src db 0dah modrm eh modrm 1,src endm codemacro FDIV dw 0f1d8h endm codemacro FDIV dst:Db(0),src:Db(0,7) db 0d8h dbit 5(1eh),3(src(0)) endm codemacro FDIV src:Mb segfix src  segfix src db 0dch modrm 5,src endm codemacro FSUBR dst:Db(0,7),src:Db(0) db 0dch dbit 5(1dh),3(dst(0)) endm codemacro FSUBRP dst:Db(0,7),src:Db(0) db 0deh  db 0dah modrm 0,src endm codemacro FIADD src:Mw segfix src db 0deh modrm 0,src endm codemacro FSUB dw 0e1d8h endm codemacro FSUB dst:Db(0),src:Db(cro FIST dst:Mw segfix dst db 0dfh modrm 2,dst endm codemacro FISTP dst:Mb segfix dst db 0dbh modrm 3,dst endm codemacro FISTPLI dst:Mw segfix ds 7,src endm codemacro FIDIVR src:Mw segfix src db 0deh modrm 7,src endm codemacro FSQRT dw 0fad9h endm codemacro FSCALE dw 0fdd9h endm codemacro FPREM  db 0d8h modrm 6,src endm codemacro FDIV src:Mw segfix src db 0dch modrm 6,src endm codemacro FDIV dst:Db(0,7),src:Db(0) db 0dch dbit 5(1eh),3(dst(0) dbit 5(1dh),3(dst(0)) endm codemacro FISUBR src:Mb segfix src db 0dah modrm 5,src endm codemacro FISUBR src:Mw segfix src db 0deh modrm 5,src endm codemacr0,7) db 0d8h dbit 5(1ch),3(src(0)) endm codemacro FSUB src:Mb segfix src db 0d8h modrm 4,src endm codemacro FSUB src:Mw segfix src db 0dch t db 0dfh modrm 7,dst endm codemacro FISTP dst:Mw segfix dst db 0dfh modrm 3,dst endm codemacro FBLD src:Mb segfix src db 0dfh modrm 4,s dw 0f8d9h endm codemacro FRNDINT dw 0fcd9h endm codemacro FXTRACT dw 0f4d9h endm codemacro FABS dw 0e1d9h endm codemacro FCHS dw 0e0d9h endm co) endm codemacro FDIVP dst:Db(0,7),src:Db(0) db 0deh dbit 5(1eh),3(dst(0)) endm codemacro FIDIV src:Mb segfix src db 0dah modrm 6,src endm codemacro FIDIV src:o FMUL dw 0c9d8h endm codemacro FMUL dst:Db(0),src:Db(0,7) db 0d8h dbit 5(19h),3(src(0)) endm codemacro FMUL src:Mb segfix src db 0d8h modrm 1,src e modrm 4,src endm codemacro FSUB dst:Db(0,7),src:Db(0) db 0dch dbit 5(1ch),3(dst(0)) endm codemacro FSUBP dst:Db(0,7),src:Db(0) db 0deh dbit 5(1ch),3(dst(0)) endm codemacrrc endm codemacro FBSTP dst:Mb segfix dst db 0dfh modrm 6,dst endm codemacro FADD dw 0c1d8h endm codemacro FADD dst:Db(0),src:Db(0,7) db 0d8h dbit demacro FCOM dw 0d1d8h endm codemacro FCOM src:Db(0,7) db 0d8h dbit 5(1ah),3(src(0)) endm codemacro FCOM src:Mb segfix src db 0d8h modrm 2,src endm Mw segfix src db 0deh modrm 6,src endm codemacro FDIVR dw 0f9d8h endm codemacro FDIVR dst:Db(0),src:Db(0,7) db 0d8h dbit 5(1fh),3(src(0)) endm codemacro ndm codemacro FMUL src:Mw segfix src db 0dch modrm 1,src endm codemacro FMUL dst:Db(0,7),src:Db(0) db 0dch dbit 5(19h),3(dst(0)) endm codemacro FMULP dst:Db(0o FISUB src:Mb segfix src db 0dah modrm 4,src endm codemacro FISUB src:Mw segfix src db 0deh modrm 4,src endm codemacro FSUBR dw 0e9d8h endm  5(18h),3(src(0)) endm codemacro FADD src:Mb segfix src db 0d8h modrm 0,src endm codemacro FADD src:Mw segfix src db 0dch modrm 0,src endm codemacro F codemacro FCOM src:Mw segfix src db 0dch modrm 2,src endm codemacro FCOMP dw 0d9d8h endm codemacro FCOMP src:Db(0,7) db 0d8h dbit 5(1bh),3(src(0))  FDIVR src:Mb segfix src db 0d8h modrm 7,src endm codemacro FDIVR src:Mw segfix src db 0dch modrm 7,src endm codemacro FDIVR dst:Db(0,7),src:Db(0) d,7),src:Db(0) db 0deh dbit 5(19h),3(dst(0)) endm codemacro FIMUL src:Mb segfix src db 0dah modrm 1,src endm codemacro FIMUL src:Mw segfix src db 0d codemacro FSUBR dst:Db(0),src:Db(0,7) db 0d8h dbit 5(1dh),3(src(0)) endm codemacro FSUBR src:Mb segfix src db 0d8h modrm 5,src endm codemacro FSUBR src:Mw ADD dst:Db(0,7),src:Db(0) db 0dch dbit 5(18h),3(dst(0)) endm codemacro FADDP dst:Db(0,7),src:Db(0) db 0deh dbit 5(18h),3(dst(0)) endm codemacro FIADD src:Mb segfix src;      endm codemacro FCOMP src:Mb segfix src db 0d8h modrm 3,src endm codemacro FCOMP src:Mw segfix src db 0dch modrm 3,src endm codemacro FCOMPP dor exec_exit: ret dr_nrdy: ;here to wait for drive ready call test_ready jnz retry ;if it's ready now we are done call test_ready jnz retry ;if not ready twice in row, mov bx,offset nrdymsg call pmsg ;"Drive Not Ready" nrdy01: call tesd_com ;transmit command to i8271 ; check status poll mov BX,last_com mov al,1[bx] ;get command op code mov cx,0800h ;mask if it will be "int req" cmp al,2ch jb exec_poll ;ok if it is an interrupt type mov cx,8080h ;else we use "not command it 5(18h),3(dst(0)) endm codemacro FNOP dw 0d0ddh endm FWAIT equ WAIT list T equ FINIT codemacro FDISI dw 0e1dbh endm FNDISI equ FDISI codemacro FENI dw 0e0dbh endm FNENI equ FENI codemacro FLDCW src:Mw segfix src db 0d9h w 0c9deh endm codemacro FICOM src:Mb segfix src db 0dah modrm 2,src endm codemacro FICOM src:Mw segfix src db 0deh modrm 2,src endm codemacro FICOMt_ready jz nrdy01 ;now loop until drive ready jmps retry ;then go retry without decrement zret: and al,0 ret ;return with no error code wboot_l: ;can't make it w/ a short leap jmp WBOOT ;********************************************* ;*busy" and al,0fh cmp al,0ch ;unless there isn't mov al,0 ja exec_exit ; any result ;poll for bits in CH, exec_poll: ; toggled with bits in CL in al,fdc_stat ;read status and al,ch xor al,cl ; isolate what we want to poll jz exec_p modrm 5,src endm codemacro FSTCW dst:Mw segfix dst db 0d9h modrm 7,dst endm FNSTCW equ FSTCW codemacro FSTSW dst:Mw segfix dst db 0ddh modrm 7,dst P src:Mb segfix src db 0dah modrm 3,src endm codemacro FICOMP src:Mw segfix src db 0deh modrm 3,src endm codemacro FTST dw 0e4d9h endm codemacro  * ;* The i8271 requires a read status command * ;* to reset a drive-not-ready after the * ;* drive becomes ready * ;* * ;*****************oll ;and loop until it is done ;Operation complete, in al,fdc_rslt ; see if result code indicates error and al,1eh jz exec_exit ;no error, then exit ;some type of error occurred . . . cmp al,10h je dr_nrdy ;was it a not ready drive ?  endm FNSTSW equ FSTSW codemacro FCLEX dw 0e2dbh endm FNCLEX equ FCLEX codemacro FSAVE dst:M segfix dst db 0ddh modrm 6,dst endm FNSAVE equ FSAVE codemacro  FXAM dw 0e5d9h endm codemacro FPTAN dw 0f2d9h endm codemacro FPATAN dw 0f3d9h endm codemacro F2XM1 dw 0f0d9h endm codemacro FYL2X dw 0f1d9h **************************** test_ready: mov dh, 40h ;proper mask if dr 1 test sel_mask,80h jnz nrdy2 mov dh, 04h ;mask for dr 0 status bit nrdy2: mov bx,offset rds_com call send_com dr_poll: in al,fdc_stat ;get status word test al ;no, dr_rdy: ; then we just retry read or write dec rtry_cnt jnz retry ; up to 10 times ; retries do not recover from the ; hard error mov ah,0 mov bx,ax ;make error code 16 bits mov bx,errtbl[BX] call pmsg ;print appropriate message  command jmps r_w_common WRITE: mov al,0ah ;basic write sector command r_w_common: mov bx,offset io_com ;point to command string mov byte ptr 1[BX],al ;put command into string ; fall into execute and return execute: ;execute command str FRSTOR src:M segfix src db 0ddh modrm 4,src endm codemacro FSTENV dst:M segfix dst db 0d9h modrm 6,dst endm FNSTENV equ FSTENV codemacro FLDENV src:M endm codemacro FYL2XP1 dw 0f9d9h endm codemacro FLDZ dw 0eed9h endm codemacro FLD1 dw 0e8d9h endm codemacro FLDPI dw 0ebd9h endm codemacro FLDL2T ,80h jnz dr_poll ;wait for not command busy in al,fdc_rslt ;get "special result" test al,dh ;look at bit for this drive ret ;return status of ready ;********************************************* ;* *  in al,cdata ;flush usart receiver buffer call uconecho ;read upper case console character cmp al,'C' je wboot_l ;cancel cmp al,'R' je outer_retry ;retry 10 more times cmp al,'I' je z_ret ;ignore error or al,255 ;set code for permanent erring. ;[BX] points to length, ; followed by Command byte, ; followed by length-1 parameter bytes mov last_com,BX ;save command address for retries outer_retry: ;allow some retrying mov rtry_cnt,max_retries retry: mov BX,last_com call sen segfix src db 0d9h modrm 4,src endm codemacro FINCSTP dw 0f7d9h endm codemacro FDECSTP dw 0f6d9h endm codemacro FFREE dst:Db(0,7) db 0ddh db dw 0e9d9h endm codemacro FLDL2E dw 0ead9h endm codemacro FLDLG2 dw 0ecd9h endm codemacro FLDLN2 dw 0edd9h endm codemacro FINIT dw 0e3dbh endm FNINI<      ;* Send_com sends a command and parameters * ;* to the i8271: BX addresses parameters. * ;* The DMA controller is also initialized * ;* if this is a read or write * ;* * ;************** 128: Records / Extent ; 8: Records / Block ; 26: Sectors / Track ; 2: Reserved Tracks ; 6: Sector Skew Factor ; dpb0 equ offset $ ;Disk Parameter Block dw 26 ;Sectors Per Track db 3 ;Block Shift db 7 ;Block Mask db 0 ;Exoff+0400h+15) / 16 tpa_len equ 0800h - tpa_seg db 0 ;fill last address for GENCMD ;********************************************* ;* * ;* Dummy Data Section * ;* rA,erB dw erC,erD,erE,erF er0 db cr,lf,'Null Error ??',0 er1 equ er0 er2 equ er0 er3 equ er0 er4 db cr,lf,'Clock Error :',0 er5 db cr,lf,'Late DMA :',0 er6 db cr,lf,'ID CRC Error :',0 er7 db cr,lf,'Data CRC Error :',0 er8 db cr,est al,20h ;test "parameter register full" bit jnz parm_poll ;idle until parm reg not full mov al,[BX] out fdc_parm,al ;send next parameter jmps parm_loop ;go see if there are more parameters ;********************************************* ;* ******************************* send_com: in al,fdc_stat test al,80h ;insure command not busy jnz send_com ;loop until ready ;see if we have to initialize for a DMA operation mov al,1[bx] ;get command byte cmp al,12h jne write_maybe ;itnt Mask dw 242 ;Disk Size - 1 dw 63 ;Directory Max db 192 ;Alloc0 db 0 ;Alloc1 dw 16 ;Check Size dw 2 ;Offset xlt0 equ offset $ ;Translate Table db 1,7,13,19 db 25,5,11,17 db 23,3,9,15 db 21,2,8,14 db 20,26,6,12 db 18,24,4,1 * ;********************************************* dseg 0 ;absolute low memory org 0 ;(interrupt vectors) int0_offset rw 1 int0_segment rw 1 ; pad to system call vector rw 2*(bdos_int-1) bdos_offset rw 1 bdos_segment rw 1 lf,'Drive Not Ready :',0 er9 db cr,lf,'Write Protect :',0 erA db cr,lf,'Trk 00 Not Found :',0 erB db cr,lf,'Write Fault :',0 erC db cr,lf,'Sector Not Found :',0 erD equ er0 erE equ er0 erF equ er0 nrdymsg equ er8 rtry_cnt db 0 ;disk  * ;* Data Areas * ;* * ;********************************************* data_offset equ offset $ dseg org data_offset ;contiguous with f not a read it could be write mov cl,40h jmps init_dma ;is a read command, go set DMA write_maybe: cmp al,0ah jne dma_exit ;leave DMA alone if not read or write mov cl,80h ;we have write, not read init_dma: ;we have a read or write operatio0 db 16,22 als0 equ (243+7)/8 ;Allocation Vector Size css0 equ 16 ;Check Vector Size ; DISKDEF 1,0 ; ; Disk 1 is the same as Disk 0 ; dpb1 equ dpb0 ;Equivalent Parameters als1 equ als0 ;Same Allocation Vector Size css1 equ css0 ;Same END error retry counter last_com dw 0 ;address of last command string dma_adr dw 0 ;dma offset stored here dma_seg dw 0 ;dma segment stored here sel_mask db 40h ;select mask, 40h or 80h ; Various command strings for i8271 io_com db 3 ;length rdcode segment IF loader_bios ;--------------------------------------------- ;| | signon db cr,lf,cr,lf db 'CP/M-86 Version 2.2',cr,lf,0 ;| | ;-------------------n, setup DMA controller ; (CL contains proper direction bit) mov al,04h out dmac_mode,al ;enable dmac mov al,00 out dmac_cont,al ;send first byte to control port mov al,cl out dmac_cont,al ;load direction register mov ax,dma_adr ou Checksum Vector Size xlt1 equ xlt0 ;Same Translate Table ; ENDEF ; ; Uninitialized Scratch Memory Follows: ; dirbuf rs 128 ;Directory Buffer alv0 rs als0 ;Alloc Vector csv0 rs css0 ;Check Vector alv1 rs als1 ;Alloc Vector csv1 rs cs_wr db 0 ;read/write function code trk db 0 ;track # sect db 0 ;sector # hom_com db 2,29h,0 ;home drive command rds_com db 1,2ch ;read status command ; System Memory Segment Table segtable db 2 ;2 segments dw tpa_seg ;1st seg starts after BIO-------------------------- ENDIF ;loader_bios IF not loader_bios ;--------------------------------------------- ;| | signon db cr,lf,cr,lf db ' System Generated - 11 Jan 81',cr,lf,0 ;| t dmac_adr,al ;send low byte of DMA mov al,ah out dmac_adr,al ;send high byte mov ax,dma_seg out fdc_segment,al ;send low byte of segment address mov al,ah out fdc_segment,al ;then high segment address dma_exit: mov cl,[BX] ;get count s1 ;Check Vector sec_flags rb host_spt track_buffer rb host_spt*host_sectsiz loc_stk rw 32 ;local stack for initialization stkbase equ offset $ lastoff equ offset $ tpa_seg equ ((lastoff+07FFh)/0400h)*40h ; round off to 1K boundarypb1 ;Dir Buff, Parm Block dw csv1,alv1 ;Check, Alloc Vectors ; DISKDEF 0,1,26,6,1024,243,64,64,2 ; ; 1944: 128 Byte Record Capacity ; 243: Kilobyte Drive Capacity ; 64: 32 Byte Directory Entries ; 64: Checked Directory Entries ; S dw tpa_len ;and extends to 08000 dw 2000h ;second is 20000 - dw 2000h ;3FFFF (128k) include singles.lib ;read in disk definitions loc_stk rw 32 ;local stack for initialization stkbase equ offset $ lastoff equ offset $ tpa_seg equ (last | ;--------------------------------------------- ENDIF ;not loader_bios bad_hom db cr,lf,'Home Error',cr,lf,0 int_trp db cr,lf,'Interrupt Trap Halt',cr,lf,0 errtbl dw er0,er1,er2,er3 dw er4,er5,er6,er7 dw er8,er9,e inc BX mov al,[BX] ;get command or al,sel_mask ;merge command and drive code out fdc_com,al ;send command byte parm_loop: dec cl jz exec_exit ;no (more) parameters, return inc BX ;point to (next) parameter parm_poll: in al,fdc_stat t=      tpa_len equ 0800h - tpa_seg db 0 ;fill last address for GENCMD ;********************************************* ;* * ;* Dummy Data Section for Interrupt Vectors * ;* PPv^P6$XX+VvD^;t Pr=DD]vDDPvtYvsDDvDD]fPv^;t P =DD]vDDPvYvDPPPv^P6$X^+PXPvtXvDDv~DD]f3PZ\\ú\ͬZ\\ͬZ\ʺ\\"b!"b"b|"]!"b*bz^]|^}t]}z^]|^||i]/g}/o#zt]/W{/_MD!́]}y/Ox/G>))Ғ], ڣ]}o|g=Š]=Š]DM!>))ҹ] =±]}{_]|]|7g}o]{_])]}{_]|g}o] * ;********************************************* dseg 0 ;absolute low memory org 0 ;(interrupt vectors) int0_offset rw 1 int0_segment rw 1 ; pad to system call vector org bdos_int * 4 bdos_offset rw 1 bdos_segment rw 1 END v^;t Po&zo&|t^}|>o&|o&}/o|/g#}}o|gBK^#Vz^#yʩ^###×^#x¤^#~#fo}|>?o&}|>o&'-6K_hpx+e 0+q+|!9~#foY#Y}!9^#V#N#F#nx7Ys# ,Y! 9F+N+V+^+~+ngRaY_Y +!9~atY{tY o&!9~AڊY[ҊY o&DM!99`i͏Y|DM!99!Y`i~# xY!9Ya~#Y!YY|^P6X^P67XXFPF^;t#PvY+PvY PF^;r#PvY+PvYnPFPPZPF^;ƸvHPAPF^;ƸsHX#V)PF^;ƸvH^ ^ uPvY+PPVF^ tFڋFFFPvXFFPvXvv؊F^PvX^^+PvXv4vXv4XFPvXFFPvXv4vXvָ^PF^PvXv4vXv4XF+FPvXv4vXv4vXFFPvXv4vXv4vXv4vXC222Z???????????NHNHNH>H>H>H>H!#bZ!b~#~#~#~bw#w#w#w!b*b*b"#b"%b*#b*b"#b"b*%b*b"%b"b!b>w#tZ!b~\#ƒZú\=ɯ<b!&bO~÷Zb!&bڐZ”Z+µZb!#b#Zb!#b#Zb!#b#F^P6+X^PPPF^P6X^P6sXX uPvYPvYPvY+PPF^P6+X^PPPF^P6X^P6sXX uPvYPvY Pv4v4h3FދF=~.FPvX4FPvX4Svދ ]h uH4P6^ u uDv v  Pv41^+^PvXPv4X^PvXAv v  Pv4A^+^PvX>H>H>H>HNHNHNHNHJXH"`]H"`bH(`gH(`lH(`qH(`vH(`{H(`H.`H.`4`>HL%NN >HOQQ 00000 @@@@@@@@@@@@@@@ @@@@@@@ @@@@@ Zb!#b# [b!#b#![!b~/w#1[:#b?*b*b))O[,=G["b"bb[:b:#b?[W!b~w+s[l[!NyqZb́[#b́[y[nZb́[y#b́[[b!bw#[nZ[[b!bw#[!bw#[> !bF^;t3 PF^;t PFPNPFP=PF^;t3PF^;tPFP PFPI PF^;r%v^@PF^PvXv3FPvXv3FPFPG PF^;tP Pz8Pv4X^PvXAvv Pv4^+^PvX Pv4X^PvX]gFPF^;r2FPPF^P6;XPv]kg3PvD^;t P=DD]vqDDPvtY+vDDv{DD]g@@@@ ~w#\Ob!#b#\y0\!b4=[=a\!b~w#<\Ob!#b#O\y0\&\b!#b#j\!bb~6#}\> !b~w#\ҭ\b!#b#¤\=‰\͘Z\!͘Zʺ\!<͘Z\ú\͘Z\\ú\͘Z\\͘Z\ʺ\\ͬZ\ú\ͬ>     PPl8PF^;t,P8DD P8DDPF^;t Pf8DDP P!8PP8FP8DD]a PvD^;ƸtHPPv^;ƸtH^# u F^PvD^;ƸtHPPv^;ƸtH^# u F!3Pv^;t 6VPbu3FF=|6ƄvFv@P6P6Vp3FF=@|60v3v6P60X u6 66363FF=Z|!FP6 u P )DD P(DD]QPp)DDP(DDPy(DD3Pq(DDPh(DD3FF= |PO(DDv]Qy%]Ë]QFv u1FPv^;tF]Ívv3]Ë]-Qv u vP<^PxP<PZP6X^Px^P<PYFF;~TxPPvX^P<^P 6^Px^PPvX^P<^PvFF;~TPvX^Px^P<PPvX^Px^P6^P<^Pv uPvYvvSPy3DDPo3DDP2DDP\3DD][6 u FFvtvtWFvtF^+ƁPFYFFPvt^+PvtXY vDD]8[PvX^P<^ƁFPvFFvDDvDPvDPEPPvD^P^^+ƈF3Pv^;t v,3FFPF^;rYPFPF^^PPv^P6)X4XPPF^PvXXvPF^PvX3aP&7DDFX3v64XZP6X3FF=Z|6ƻv3v6366z63]K3FF=|6vFv60]OK$BBPvXvݸVv3KPFPysP/zDDPvXv]Pv u v u2vPv^;u3]Ívv]Ë]PvFPxV3PFP(F^;uF]ø=PFPxvFPwV3PFP(F^;uF]ËP6j;X6VPxF6 u FFv uFFFFFFP,DD3FF;|LvPvX^P<^ƁPvPvX^P<^Ɓ PvPc,DDPY,DDv;Pv,PvP6X^P<^ƁPX^Px^ƁF uPvYvv=Pc2DDPu1DD]Z3FF= ~vtv3v]ZP P!P2DD6 u:IFF u7PvY PvY+ 'F5FPP7DDdP7DD PPDvDPP8NPPD]_ vDDvDPvDPDPvD^;ƸtHPPv^;ƸtH^# u F^PvD^;ƸtHPPv^;ƸtH^# u F!3Pv^;t F3V^;uFP "DD3FF=|4PvvX/0Pvv^;t v3VFPIsDD^;tUPFP u 3"ZPFP u K u8FPF^# u36]06xDDP^PP4FP&DDP{&DDF]Ë]OPv]O@PFPxPv$vqDDFF3Vv)xDD^;t]ø:Pv^;tWDPv^;ƸwHPAPv^;ƸrH^ uVvwDD^;|FrvP6X^P<^ƁPnP+DDv;P:v,PJvP6X^P<^ƁP vP6X^P<^ƁPvtvt]wTFF=}6 u FFFF=}Vv+FP1DD3FF=|6FPFFPOFPFFPWvPT1DD u3FF=|vv3vPvtVFPY3FF=|JvvF+FPvXPvvXFP+FPvXXvP0FPPvD^P^^+ƈF3Pv^;t v,3FFPF^;rYPFPF^^PPv^P6)X4XPPF^PvXXvPF^PvX3FPT5DD]F^3Pv^;tPvD^ƈFP^P)"]c]J3FF=d|+F3PF^;u F]ÍvF]Ë]I) uOP DDFFPF^;vwvF]Ë]\I3Fv7v7 uH4P^ uF3FvwDDPF^;|gFPvvPf uL!Pvv^;ƸrHP~Pvv^;ƸwH^ uv]3PFPV3P%DDlP6j;XFP6j;VP7/P$DD6lvDDPFPu/FPF^;ƸtHP PFvtX^# uvv vvPFYFv,v,[v&DDvtvt]SyP&+DDvv]S VF^ t FFP *DD VF^ tP ^PF^+Ɓ`FFP)DD VF^ t FFDDP/DDP/DD3P/DDP/DDFF=}? uvtvPR/DDvvP?/DDv,P6 uH4^# u+'F5Fv uPvY+SFv uPvY+IF uPvD^;ƸtHPPv^;ƸtH^# u FPvD^;ƸtHPPv^;ƸtH^# u FGPPPvD^P^^+^PPv^P6)X4XFFPvtX]B]vP3^PvtXvDP^Pv737P uH4X#V^ uv737P^ uv737v7v7v7 uv737v7v7v^;ƸtH^ u v3]ÊFP"DD8]MF;FF]ËF]Ë]Mt a6 u36P^# u P7P6 Vu>P6Vu6 16 263P)DD VF^ tP ^PF^+Ɓ@FFP)DD]RPa*DDPvX^P<^ƁFPvX^Px^ƁFvFPFPvvvFPFPP)DDqP@)DDPP]R+767PvYPvY+vvLPr/DDP.DD]WyPX/DD{PN/DD]WP=/DD]W6 u, uPvY%PvY P-DDP`.DD FP-DD FP-DD]:W xP<PxPP6X^^PvtX3PvD^;u vt]\ 6 u FFvtvt_FPvtF^+^+PFYFF5Pvt^+PvtXY#vDD]T\PvX^P<^ƁFPvX^Px^ƁF?     7v7P7^ƈ73FP7^PPv^P6x;XXP7^PPv^P6x;XX7 u*P7^PPv^P6x;XX7 u*P7^PPv^P6x;XX7 u*PP^PPF^PYP7^P67XtPDD PxDDvDDFP uH4^# u dPDDdPDD P0DDvDD] u0vDDDPPdPmDDvCDDPPaPPDDvHDDdP>DD]+PDDYPDD!vDPvDPPDD3FvDXPF^;vSPF^PvtJXPPF^PvtDD])3FFPF^;rFPDDv]i)FP DD]T)PF^;ƸtHPPF^;ƸtH^ uFPPhAIDD6 u]Ê uF u] ]YP7^P67XtF7PDDFPF^;t]ø PF^;tYP7^P67XtPF^;uYP7^P67XtP6 XYP7^P67]ø9PF^;ƸwHP0PF^;ƸrH^ uPpDD0PF^+ƈFFPPDDFPF^;t]ø PF^;t F]øPF^;t 3F69PF^;ƸwHP0PF^;ƸrH^ u PDD,0PFX+V P^+ƉFF=};PF+FPPDDFPvX4VDDv,] uPFP|PDDPPF^^PFPS3FF= | 3PF^;uvPFPdP@DDP7DDPPF^^vt3FZvDPF^;u!FPvbvDPvPPDDF]Ë]#PPz/PDDYPF^P67XtPYPF^P67XtXYPF^P67XtPYPF^P67XV PYPF^P67X=FPPQA=](v uA Pv^;t P_DD PVDD vPFDDv](v uvPDDv]o(v uA Pv^;t PDD PDD vPDDv](A     XtP[P6 VX<\P6 VB<FP6 V,<0P6 V<" 7P~GDD]YP7^P67XtF7PDDFPF^;t]ø PF^;tYP7^P67Xt]ËF udF=FP(~v, uFFvv Pv},X u Fv, ukPvYFP6X:v4X u5FP64XF "PvueUUU )]WUFtF uv~JyvDv~;3SSSSSS_Nj, . t. .CCsCCt֋F-0@FFދF3FF܋!~]_" " " " WUF uv~FuF 6] 7PPA u 6]7PPA u 6]FF=~[PDDvF6PvX^;vXPcDDv]I uMCP8DD uIP!6DD u M3P^DD*P6^;tYP7^P67XtF;P*P)PYP7^P67XtXYP7^P67XtPF^;u[FPYP7^P67XVYP7^P67XtPYP7PF^;uPYP7^P67Xt^;t63<PYP7^P67Xt^P6X67PrFDDP6 uH4^ u]Ê u u] ]3YP7^P67XYP9vX u Fv, ukPvYFP64Xv8X u5FP6XyFqwPvY+PvHX u# PF.C4v,3Pf~vFvFFF F} vi[Y3PPPPQS vT5Qv~;rwNNOOv~FFGGvFFYċF-?)FF1F~Cv~]_ ܊o w y2y:}ĹW9Wu KK$t w$t$t2 ܉G_tDD܈FPF^# u 3]]/FPF^#ƈFF]Ë]z u"6 u UPDD6 u UPDD]r6P*gPdDD0lPWDD#qPJDD]^P67XV37P@DD] P6j;XPlDD6j;VP] YP7^P67XtF7PDDFPF^;t3PYP7^P67Xt^;t33PF^;u636*PYPtF7PMDDFPF^;t]ø PF^;tjYP7^P67XtPF^;u@YP7^P67XtP66z66363R6636)6v4X@PvXvvW PviX uPv@X u3PvVPvYF uvm~rv[vaF]Ë]dF FN5v/X u"vJ~#vƸ-F=|tt4^XZ[YU]MQSRP_D3۹%uPPP8PRS3PD%-?=#=|)D-8yT\D 3E_Xˎ& A.2 UWFVv~ u y ؃ y ރS 3SN u]ÍwP DD6 u PDD4PDD6 u PDD PDD]P6j;X6j;VPQ u6/DDPPFyPF^;ƸtHPYPF^;ƸtH^ u]ønPF^;ƸtHPNPF7^P67Xt^;t u P6j;X"P6j;XP]DD6j;VP6"DD uR3PJPDD u$666366366673{ k uH4PP6 uH4^ ^ uD u u(7P6;Xa  u8P>BY u 7PKDDD7P?DDD]KuP;P8P uH4^ utvƸ0vƸ.vvYF=|vvY+3F3Vv^;|vƸ0rv}FF0PvXVXvvL`~Nv, uF uvƸ.v, uIv;w r;w+@N^Yt tu t؃FV _] v UF fF FfF FfFV ] v ûWg؎Ћ&>>@O9gs 3  UF t5x t/PV±$'@'Nu^;ƸtH^ u3]øPDDh]ËGtw VU v2F%1FF0CP3PPP!FV^ t؃]^Ëܸ1GVUF tFuv~vv~~D+EtyEȻYKKyً3x CC$CCP?DDP{DD 636 u=bP6j;X6j;VP6bDD u PLDDPDD6 uH4P6^# u^3PYP7^P67Xt^;u7YP7^P67Xt3YP7^P67XVSDDYPP;P7P;P7YP7^P67XtF7PDDFPF^;t]ø PF^;tYP7^P67XtPF^;uPYP7^P67Xt^P6;XP6XUP6^;t u5FF0PvX^v"vG~v3VF+F ^ t3]Ë]v u%Pv^;tF-Pv4^;ƸtHF u vvF0PF^;u F*Pv^;tv 4XF 9nvnX&^3^.U+;&v^.PF^;r PvX^P=^ƉƋ4F uF]øP PPD]3FF6WvQ~YX uv:f~?3F> vX u3]ËF=|3E y3CC1W^~FuF]^^XZ^X33SS^XZ^X3SS y ؃πRP0CPSVWW^3؎W_E %E%] VW_^D %  DEËE E E E uE7E tm ]]]]E 7^P67XtPF^;u7P=DDPKDD]ÊFPYP7^P67XtXYP7^P67XVDDw] 7PPbB u 6]` 7PP4B u 6]2 7PPB u P6j;X"P6j;XPDD6j;VP6"DD u4PtSDD u6*cvW uq@ 6*7P|BDDPDD,*P6^;ubJ u m6*7P8BDD*P6^;uGP6j;X6j;VPB     vF3FvPRDD u-0PvƊX+V PvX^^ƉF.Pv^;ƸtHF uv*Pv^;tv 4XFvF3FvPDD u-0PvƊX+V PvX^^ƉF3FlPvawrb _FPRPFFPvFF=u F=t3PFFPvXFVF=tF=uPRPvF=u F]ø]Ë]DPvY+v4VF^;u+P t-3PPPvX^Pvt^P3F F u vF u@PvtY PvX^Pvt Xvtt vttXZ^_+RPvt X^_;u;w&vtt vttXZ^_+RPvt XZ]6 PvtX^# ugvPF^#PPvX^Pf^ƉƊD^;tPvtY PvX^Pf^ƉƊDPvXPPvtX^#^;t3Pv4^;tPvtX PvtX PvtX v4XPvtX5^# uvvPvX uF gizog\TIA6.3F uF;FwF u-Pv܊^;t 0PF^;t,Pv4vvЃv,v,vVv,^;wPvVvvЃF;FwvvY+3FvvvvЃF uF P!DD^;ƸtHF u vvPF uFF Fv~FF 3PvV!F޸gPv^;tF=|F=PF^PvVPvދYvP\Pv)P\^ƉF܍v܋ƸEF=|vPdPDD6=Fv4 uvVv4^;rFFƋ4Fv4VvXFPvXPvtX^PvXVF^;t+PvtX^PvtYv4VvX FFFFv4FPvtX^PvXVF^;t(PvtX^Pvtvt X^;|Pvt vt^ƉXvt XRPvtt XZ^_RPvttXZ^_;u;r.vt XRPvtt XZ^_RPvtXZTPZFvt PYPvX^^;|PYPvX^Pvt^PPvXRPPvtt XZYz^uv4VPVPv4VFP?^;PYPvtXvtPvtX ufPvtvtVFPvV=^ƉXPvtX5^# u F uv4V#PPv4t#t!XZY[RPvtXZTPZPu(v, uPvVvvЃvPv4vvЃ]4F̍v4^Fv4,X ux Pv̊^;t Pv̊^;t PvX6APv̊^;sZPv̊^;v Pv̊Yv́4Xw܋Ƹ-F؉Fv܋Ƹ+v޸PvU\Pp DDF썆\FF uFF Fv~FF 3PvVF޸PvދF^^PvVPvދYvFށP\Pv*P\^ƉFܸgPv^;t=0Pv܁,tYv4VvX6464^X+VPvtX^PF^Ɓ^;t#PvtX^P6Y+3PvX]FP0^;ƸvH uH uP9PF^;ƸvH uHPX]Ë]cvuDDFPvtX^# u 3ҋ]øPvtY#F Pv_RPv4t!XZTPZv4V"PA u@PvtY v4XIPvtY#]UNV]vvX^Fv F uPvvF]Ë]fPF^P u]vYFPvtX5^# u v4vtX^# uvttXZ uv4t!,\t4XZvtVP!v4V!PFPYPF^;|1PvVvt^ƉƊ^;t v4XPYPF^+ƙRPvtTY[ӉTF]ËF u#v4 u v4VvPvXF҉FЉFθF̸FPv4^^ƉFv4,X uv̊ u<Pv̊^;t F́F<>Pv̊^;t F́FFPv4^VF^ƉXF=}P P Pv̊ uv́4Xv,4X4^;t v3.Pv܊^;tv3\PwDDF썆\FFF9FF*F FFF FFދF u)F Fvt4vXZTFF EF=|v 4XRPvXZTv 4X3RPt XRPvvvtt XZ^_^_׉VFvvXZVFvt XRPvtt XZ^_RPvttXZ^_;u;r*vt XRPvtt XZ^_RPvtXZTvvvttXZ^_׉VF3ҋ]aNvt X u$vtt vVvt u vtVvPPvX^P=^ƉX]Ë]Pvv^]Ë]FF=|0vV=^ƉƋ4 u vv4Xv]ZPF^+PdFPvtX^# uO PvtX^# ]Ë] PvtX^# uPvtX^# uPv4^;tqvtvtV P PPvt Pvt^Pvt Xvt XPvtX hv4VDDPvtXPvtX^# u Pvt^;tv́4X+ F̸>PvЊ^;tvЁ4XF̸PPv# ^;uPvv ^;uPPv ^;uP PP2)PFԉXFPvP ]YFFF=|,vV=^ƉƋ4 u vvXZTvލ\Pvt4F u2\F3RPvt4XZ^_;u;r v܁vODDFF uPvXVF^;rbPF^PPvX^PPvX^PF^Ɓ^+Pv}0PPF^+FPvbPF^ƉFPF^PPvX^PvXZ^_;u;r9vt XRPvtt XZ^_RPvvXZ^_;u;sR PvtX^# uvuDDRPvvXZ^_##RPvt XZTvt 3vlDDvtt vvXZ^_+RPvt XZvt vt X^;vt vt XvvXZ]Ë]u vPv4VPI^;@PvtY @PvtX^# uPPX]Ë]FFFv uv4^PdFF uFPvY F uFF uFPvY vt vt  vt ]øRPvtt XZY[5RFZ3FFF=|vttPvX^RPvtt XZ^_^_;u;rPvX^Pvt^PPFF3RPv4t!XZTPZv4V!PFF=t F=4XF=tPPTFF uPv4X5^#PvtXPvS^;:PFƊ^;tFFF=|5FF=|@vVPvX^Pf^ƉƉ^ƉƊPvVF^ƉƊPX^;t v4XF=t*PvX^PF^^+ƁPPvX^PPvX^PF^^+PPF+F^PvX.\FvIDDFv 4XFv*DDFF uF;FrFF3Ftv FܸF3FZFFܸF3FFCcsdDxXuUoObBfeC     *FP!PF^ƉFXF =|RPvvXZ^_;u;r FvvXZ؃VFRPv XRPvv9XZ؃RPލ^YƉƊPv,4^XF ؙRPFu5XZU ujvvXZVF3RPv X3RPvv[ލ^Yme of file to read in or press RETURN to abandonEnter name of file to save to Save to file Creating new file already exists. Should I overwrite it? (y/n) Saving, please wait.nCan't write to file. See if disk is full.Can't find file named Do ysaved to a file. Do you still want to sign off? (y/n)Can't find overlay file Was unable to read language successfully.Should I load that language onto the screen now? (y/n) On logged drive can't find file: Enter character of drive to find file on t X^;}Ovtvt XvvtXRPvt TY[ӉTPvt XPvt Xvt X uPvtX5^# u3Pvt Xvyvt X u Pvt X PvtY FPvt 4vt^ƉX]t vt X^;} PvtX^# uvDDPvtX^# uOvtvt X^;t*vtXRPvt TY[ӉTvt 3vt X uvt 3viDDvt vt X^;}]Ëvt PvtX]Ë]364v2X+VFƉƊPv,4^Xv X3RPFu5XZU uF u-Pv,4^XP!PF^+F^ t3FFPvvF]Ë]P%PF u:PFƊ^;tIvP]FF=A}F=P~F@PvXou wish to load in all settings? (y/n) Mark the items in the menu that you wish to read.Select 'Read and Return' when all items are marked.Reading in. Please wait.Failed to read entire file. Press any key to continue Can't read in function keys, tabl or press RETURN to give up Not a valid drive unsigned char. Valid chars are A,B,C and D.Press the key of character you wish to define. To END session press RETURN. To save to a file press F1.Choose what you want to use as starting languageMNGR This is cr^;s3]Í6464X^+ƉFv6YF]Ë]U؎~NF]vv4VvPvX^PvYPv4X]؍vVvvVP݃]Ë]oFFv4^ uv,4Xv4^Pv4^X uFgPvY P PvtVvVPvtVF uvVPvt V( uF]vc]Ë]v4Fv udv4^PFF=.t:F=!|]ËF uv,4XFPv4^Xe too big.Can't read character set. This is a FOX.User language is the wrong size. I can't read it in.Please wait.There is no user defined version present.Do you want to read one in? (y/n) Couldn't read information from that file.Do you want to re. or press ESC to abandonYou have asked to start with: Please confirm (y/n)Couldn't load up language. Do you want to continue? (y/n)CURRENT CHARACTER SET IS: DEFINING CHARACTER: ASCII value: FILL or BLANK a cell ---------- Number Paeate cha set goodbye CUST3.OVLCUST3.OVLCUST4.OVLCUST1.OVLCUST2.OVLCUST5.OVLCUST5.OVLLANGUAGE.CSTLANGUAGE.CSTA:LANGUAGE.CSTCUSTOMIZ VER%s %s%s %sCUSTOMIZ VERU* DEL%dCHARSET.CSTU*None%s%c%s%x CUSTOMIZ VERHex Val:<>?+*}{`=|~_SPAC]Ë] ؋vPv^;t+v4^ u]Ív4XvPv^;r]ø]Ë]FFv4^Pv4^X uF]Ë]iv4XFv4^ uPF+F^ t3]Ë] ׊FPAFPvX]Ë]PPF^^#ƉF6=Fv4F uvVvtX^;sPF^PvtX^;sMPvX^PF^ƁFv4VvXPvtX+F^+PvtXFPvX vtXFv4VvX FFSF uPF^Pset keyboard to standard layout. Please confirm (y/n) Leaving this routine without saving to file. Please confirm. (y/n) Do you want to end this session without saving keyboard setting? (y/n) WARNING! Redefining this key disables a command key. Proceed?d 5 or SPACE BAR. MOVE cursor ------------------- Number Pad arrow keys. LOAD grid with a char --------- F2, then character. CLEAR grid -------------------- F3. Change DECSENDER LINE --------- F4.RETURN - to ENTER this characteESPDELDL%02xCharacter looks like this >A:<>=,:;*?&![]()/$^A^B^C^D^E^F^G^H^I^J^K^L^M^N^O^P^Q^R^S^T^U^V^W^X^Y^Z^[^\^]^^^_ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z { | } ~ _ a b c d e f g h i j k l m n o p q r s t u v w x y z [ \ ] ^ DEL^;~ ZPF^;~ PvYF]Ë]֊FPa^;~ zPF^;~PvYF]Ë]vփFPvtX^# u7P PP!փPvtX^# uwFvVvX^;r^ Pv^;tPvtX^# uF u%FPvtXFPvXPvYF]Ë]U؎v~N;rNO]۸PvvT]Ë]vDDFPvtX^# u1P PPDD3FvVvX^;r3VvDDF^;|vƋFvPv (y/n) Do you want to set up this definition in keyboard now? (y/n) PRESS: F1 - leave routine F2 - start over F3 - abandon F4 - save to fileRE-ARRANGING THE KEYBOARDAll keys have REGULAR and SHIFT values.Alphabet keys and some characters also havr in table.ESC - to ABANDON this character.Should I save to file Can't find needed character set in CHARSET.CST fileDo you wish to use the currently loaded user language?Read from file Couldn't read language from that file. Enter na = ` + * < > ? ! " # $ % & ' ( ) SPACE - @ ; : , . / 1 2 3 4 5 6 7 8 9 0 Enter a brightness level from 1 to 15:That is not a valid intensity level.Level - Show that setting on screen now? (y/n)Extra (80 x 26) You have made changes which you haven't  Pv4V[v4^Pv4VAv4XFvVvX^;rX Pv^;tPvtX^# u v Ptvv4^P]v4Xvt vt X^;vt vt X@PvtX^# uPFPX]Ë] ՋvtvtX^# uF=tvt ,v,nF= tR3VvDDF^;|JF= tv 0vtFPvtY F= t@PvtX^# uPFPX]Ë]LڸPvtX^# uPvtY#vD]ËvD     e CTRL (^) values.The Number Pad arrow keys move the highlight through thecharacter set at the top of the screen.Hitting a key (Regular, Shift or Ctrl) assigns the highlighted character to that key.Press function key you wish to To return to FuncQ7  "(.4:@F $*06D "(.4:  N SIZE Small (132 X 50) Normal (80 X 24) Extra Lines (80 x 26)SCREEN EMULATIONS ADDS Viewpoint ADDS Regent 2025 Hazeltine 1500 FUNCTION KEYS Create/Erase a StringEdit a String Display All Keys Read Present SettingsLANGUAGES Asciition Key Menu press RETURN To return to Main Menu press ESC. create or erase.edit.DEFINING FUNCTION KEY: Use <-- and --> to move in string. Press RETURN when done, ESC to abandon. Before entering RETURN, ESC, <--, -->, DEL or @ into string pr            ^|-[!Ha.l.Mb"`@e ' E d r 8  (American) British Danish Dutch French German Italian Norwegian Swedish User Defined KEYBOARD LAYOUTStandard User Defined SETTINGS TO READ INScreen and Cursoress @.To abandon press ESC or any other key to continue Keys used: Press ESC to abandon display or any other key to start display Bytes left in bufferRead in special function keys from keyboard PLEASE DON'T PRESS ANY KEYS No keys programmed. MS8j  E { G  V #\+RciJV W'/ No ChangesReturn to Main Menu SCREEN AND KEYBOARD CUSTOMIZATION PROGRAM Ver Use Up and Down arrows to move through menu.Pr SettingsLanguage and Keyboard Function KeysUser Created CharactersUser Created KeyboardRead in Marked Choices^C >>> VIEWHAZ15REGENT U*CUST5.OVLCUST5.OVLCUST5.OVLCUST5.OVLCUST5.OVLBAD FILE$%03dcon: TOO MANY ARGS$wa9PTRShould I load that keyboard layout into the keyboard now? (y/n) Do you still want to leave this routine? (y/n) Can't find file on that drive either. CURRENT SETTINGSPress ESC to leave this menuNot a valid CP/M file name. Please re-enteess RETURN to select an entry.Press RETURN to select an entry. Press ESC to abandon this sub-menu.ABDHFGINS NO CORE$ $$@Y@@חA7yACnF?O8M30HwZ?sOu?{Gz?-C6?:0yE>ؗrw REDIRECTION ERROR$cFREE$READ$WRITE$4 pPiITTbdHRNEFEfDE "%Yn@|&~WwSMc`LUK:}A r nameMS96PTRMS97PTRMS98PTRManager CUSTOMIZ VER 5000FOX Program can not run on this terminal %cMAIN MENUBrightness Screen Type Cursor Type Screen Size Screen Emulation Function Keys Language KҜ<2#I9C~P}9Ynsw{M