From 80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6 Mon Sep 17 00:00:00 2001 From: Rich Turner Date: Fri, 12 Aug 1983 17:53:34 -0700 Subject: [PATCH] MS-DOS v2.0 Release --- v2.0/bin/ANSI.DOC | Bin 0 -> 6784 bytes v2.0/bin/CHKDSK.COM | Bin 0 -> 6330 bytes v2.0/bin/COMMAND.COM | Bin 0 -> 15480 bytes v2.0/bin/CONFIG.DOC | Bin 0 -> 3456 bytes v2.0/bin/CREF.EXE | Bin 0 -> 13824 bytes v2.0/bin/DEBUG.COM | Bin 0 -> 11764 bytes v2.0/bin/DEVDRIV.DOC | 802 +++++++++++++++ v2.0/bin/DISKCOPY.COM | Bin 0 -> 1419 bytes v2.0/bin/DOSPATCH.TXT | 62 ++ v2.0/bin/EDLIN.COM | Bin 0 -> 4389 bytes v2.0/bin/EXE2BIN.EXE | Bin 0 -> 1649 bytes v2.0/bin/FC.EXE | Bin 0 -> 2553 bytes v2.0/bin/FILBP.PAS | Bin 0 -> 6144 bytes v2.0/bin/FIND.EXE | Bin 0 -> 5796 bytes v2.0/bin/FORMAT.DOC | 393 ++++++++ v2.0/bin/FORMAT.OBJ | Bin 0 -> 4864 bytes v2.0/bin/FORMES.OBJ | Bin 0 -> 1152 bytes v2.0/bin/INCOMP.DOC | Bin 0 -> 2688 bytes v2.0/bin/INT24.DOC | Bin 0 -> 4224 bytes v2.0/bin/LINK.EXE | Bin 0 -> 42368 bytes v2.0/bin/MASM.EXE | Bin 0 -> 77440 bytes v2.0/bin/MORE.COM | Bin 0 -> 4364 bytes v2.0/bin/MSDOS.SYS | Bin 0 -> 16690 bytes v2.0/bin/PRINT.COM | Bin 0 -> 3808 bytes v2.0/bin/PROFIL.OBJ | Bin 0 -> 2304 bytes v2.0/bin/PROFILE.DOC | Bin 0 -> 3968 bytes v2.0/bin/PROHST.EXE | Bin 0 -> 41728 bytes v2.0/bin/PROHST.PAS | 403 ++++++++ v2.0/bin/QUICK.DOC | Bin 0 -> 3456 bytes v2.0/bin/README.DOC | 177 ++++ v2.0/bin/RECOVER.COM | Bin 0 -> 2277 bytes v2.0/bin/SORT.EXE | Bin 0 -> 1216 bytes v2.0/bin/SYS.COM | Bin 0 -> 850 bytes v2.0/bin/SYSCALL.DOC | 1657 +++++++++++++++++++++++++++++++ v2.0/bin/SYSIMES.OBJ | Bin 0 -> 384 bytes v2.0/bin/SYSINIT.DOC | Bin 0 -> 3072 bytes v2.0/bin/SYSINIT.OBJ | Bin 0 -> 3328 bytes v2.0/bin/UTILITY.DOC | 813 +++++++++++++++ v2.0/source/ALLOC.ASM | 371 +++++++ v2.0/source/ANSI.txt | Bin 0 -> 6784 bytes v2.0/source/BUF.ASM | 508 ++++++++++ v2.0/source/CHKDSK.ASM | 901 +++++++++++++++++ v2.0/source/CHKMES.ASM | 477 +++++++++ v2.0/source/CHKPROC.ASM | 1408 ++++++++++++++++++++++++++ v2.0/source/COMEQU.ASM | 33 + v2.0/source/COMLINK | Bin 0 -> 128 bytes v2.0/source/COMMAND.ASM | 788 +++++++++++++++ v2.0/source/COMSEG.ASM | 38 + v2.0/source/COMSW.ASM | 13 + v2.0/source/CONFIG.txt | Bin 0 -> 3456 bytes v2.0/source/COPY.ASM | 579 +++++++++++ v2.0/source/COPYPROC.ASM | 526 ++++++++++ v2.0/source/CPARSE.ASM | 291 ++++++ v2.0/source/CTRLC.ASM | 468 +++++++++ v2.0/source/DEBASM.ASM | 1264 ++++++++++++++++++++++++ v2.0/source/DEBCOM1.ASM | 694 +++++++++++++ v2.0/source/DEBCOM2.ASM | 1269 ++++++++++++++++++++++++ v2.0/source/DEBCONST.ASM | 1103 +++++++++++++++++++++ v2.0/source/DEBDATA.ASM | Bin 0 -> 2816 bytes v2.0/source/DEBEQU.ASM | 32 + v2.0/source/DEBMES.ASM | Bin 0 -> 5248 bytes v2.0/source/DEBUASM.ASM | 868 ++++++++++++++++ v2.0/source/DEBUG.ASM | 838 ++++++++++++++++ v2.0/source/DEV.ASM | 439 +++++++++ v2.0/source/DEVDRIV.txt | 802 +++++++++++++++ v2.0/source/DEVSYM.ASM | Bin 0 -> 2688 bytes v2.0/source/DIR.ASM | 1084 ++++++++++++++++++++ v2.0/source/DIRCALL.ASM | 507 ++++++++++ v2.0/source/DISK.ASM | 1302 ++++++++++++++++++++++++ v2.0/source/DISKCOPY.ASM | Bin 0 -> 6656 bytes v2.0/source/DISKMES.ASM | Bin 0 -> 7808 bytes v2.0/source/DOSLINK | 5 + v2.0/source/DOSMAC.ASM | Bin 0 -> 6656 bytes v2.0/source/DOSMAC_v211.ASM | 274 ++++++ v2.0/source/DOSMES.ASM | 355 +++++++ v2.0/source/DOSSEG.ASM | 17 + v2.0/source/DOSSYM.ASM | 904 +++++++++++++++++ v2.0/source/DOSSYM_v211.ASM | 963 ++++++++++++++++++ v2.0/source/EDLIN.ASM | 1846 +++++++++++++++++++++++++++++++++++ v2.0/source/EDLMES.ASM | Bin 0 -> 3200 bytes v2.0/source/EDLPROC.ASM | 531 ++++++++++ v2.0/source/EXE2BIN.ASM | 514 ++++++++++ v2.0/source/EXEC.ASM | 1035 ++++++++++++++++++++ v2.0/source/EXEMES.ASM | Bin 0 -> 768 bytes v2.0/source/FAT.ASM | 362 +++++++ v2.0/source/FC.ASM | 1684 ++++++++++++++++++++++++++++++++ v2.0/source/FCB.ASM | 512 ++++++++++ v2.0/source/FCMES.ASM | Bin 0 -> 2048 bytes v2.0/source/FIND.ASM | 932 ++++++++++++++++++ v2.0/source/FINDMES.ASM | Bin 0 -> 1408 bytes v2.0/source/FORMAT.ASM | 1627 ++++++++++++++++++++++++++++++ v2.0/source/FORMAT.txt | 393 ++++++++ v2.0/source/FORMES.ASM | Bin 0 -> 4529 bytes v2.0/source/GENFOR.ASM | Bin 0 -> 4096 bytes v2.0/source/GETSET.ASM | 627 ++++++++++++ v2.0/source/HRDDRV.ASM | 501 ++++++++++ v2.0/source/IFEQU.ASM | 18 + v2.0/source/INCOMP.txt | Bin 0 -> 2688 bytes v2.0/source/INIT.ASM | 939 ++++++++++++++++++ v2.0/source/INT24.txt | Bin 0 -> 4224 bytes v2.0/source/MISC.ASM | 648 ++++++++++++ v2.0/source/MORE.ASM | Bin 0 -> 3712 bytes v2.0/source/MOREMES.ASM | 17 + v2.0/source/MSCODE.ASM | 615 ++++++++++++ v2.0/source/MSDATA.ASM | 342 +++++++ v2.0/source/MSDOS.ASM | 12 + v2.0/source/MSHEAD.ASM | 198 ++++ v2.0/source/MSINIT.ASM | 408 ++++++++ v2.0/source/PCLOCK.ASM | Bin 0 -> 3200 bytes v2.0/source/PRINT.ASM | 1645 +++++++++++++++++++++++++++++++ v2.0/source/PRINT_v211.ASM | 1645 +++++++++++++++++++++++++++++++ v2.0/source/PROC.ASM | 130 +++ v2.0/source/PROFIL.ASM | 705 +++++++++++++ v2.0/source/PROFILE.txt | Bin 0 -> 3968 bytes v2.0/source/PROHST.HLP | 35 + v2.0/source/QUICK.txt | Bin 0 -> 3456 bytes v2.0/source/RDATA.ASM | Bin 0 -> 6784 bytes v2.0/source/README.txt | 177 ++++ v2.0/source/RECMES.ASM | Bin 0 -> 5760 bytes v2.0/source/RECOVER.ASM | 876 +++++++++++++++++ v2.0/source/ROM.ASM | 530 ++++++++++ v2.0/source/RUCODE.ASM | Bin 0 -> 6912 bytes v2.0/source/SKELIO.ASM | 1377 ++++++++++++++++++++++++++ v2.0/source/SORT.ASM | 420 ++++++++ v2.0/source/SORTMES.ASM | Bin 0 -> 2688 bytes v2.0/source/STDBUF.ASM | Bin 0 -> 256 bytes v2.0/source/STDCALL.ASM | Bin 0 -> 256 bytes v2.0/source/STDCTRLC.ASM | Bin 0 -> 256 bytes v2.0/source/STDFCB.ASM | 16 + v2.0/source/STDIO.ASM | 17 + v2.0/source/STDPROC.ASM | 16 + v2.0/source/STDSW.ASM | 34 + v2.0/source/STRIN.ASM | 292 ++++++ v2.0/source/SYS.ASM | 587 +++++++++++ v2.0/source/SYSCALL.ASM | 749 ++++++++++++++ v2.0/source/SYSCALL.txt | 1657 +++++++++++++++++++++++++++++++ v2.0/source/SYSIMES.ASM | Bin 0 -> 512 bytes v2.0/source/SYSINIT.ASM | 1424 +++++++++++++++++++++++++++ v2.0/source/SYSINIT.txt | Bin 0 -> 3072 bytes v2.0/source/SYSMES.ASM | 51 + v2.0/source/TCODE.ASM | 1088 +++++++++++++++++++++ v2.0/source/TCODE2.ASM | 522 ++++++++++ v2.0/source/TCODE3.ASM | 677 +++++++++++++ v2.0/source/TCODE4.ASM | 1002 +++++++++++++++++++ v2.0/source/TCODE5.ASM | 953 ++++++++++++++++++ v2.0/source/TDATA.ASM | 243 +++++ v2.0/source/TIME.ASM | Bin 0 -> 7040 bytes v2.0/source/TSPC.ASM | Bin 0 -> 4480 bytes v2.0/source/TUCODE.ASM | Bin 0 -> 7808 bytes v2.0/source/UINIT.ASM | Bin 0 -> 896 bytes v2.0/source/UTILITY.txt | 813 +++++++++++++++ v2.0/source/WSBAUD.BAS | Bin 0 -> 1152 bytes v2.0/source/WSMSGS.OVR | Bin 0 -> 27264 bytes v2.0/source/WSOVLY1.OVR | Bin 0 -> 40960 bytes v2.0/source/XENIX.ASM | 907 +++++++++++++++++ v2.0/source/XENIX2.ASM | 626 ++++++++++++ 156 files changed, 56403 insertions(+) create mode 100644 v2.0/bin/ANSI.DOC create mode 100644 v2.0/bin/CHKDSK.COM create mode 100644 v2.0/bin/COMMAND.COM create mode 100644 v2.0/bin/CONFIG.DOC create mode 100644 v2.0/bin/CREF.EXE create mode 100644 v2.0/bin/DEBUG.COM create mode 100644 v2.0/bin/DEVDRIV.DOC create mode 100644 v2.0/bin/DISKCOPY.COM create mode 100644 v2.0/bin/DOSPATCH.TXT create mode 100644 v2.0/bin/EDLIN.COM create mode 100644 v2.0/bin/EXE2BIN.EXE create mode 100644 v2.0/bin/FC.EXE create mode 100644 v2.0/bin/FILBP.PAS create mode 100644 v2.0/bin/FIND.EXE create mode 100644 v2.0/bin/FORMAT.DOC create mode 100644 v2.0/bin/FORMAT.OBJ create mode 100644 v2.0/bin/FORMES.OBJ create mode 100644 v2.0/bin/INCOMP.DOC create mode 100644 v2.0/bin/INT24.DOC create mode 100644 v2.0/bin/LINK.EXE create mode 100644 v2.0/bin/MASM.EXE create mode 100644 v2.0/bin/MORE.COM create mode 100644 v2.0/bin/MSDOS.SYS create mode 100644 v2.0/bin/PRINT.COM create mode 100644 v2.0/bin/PROFIL.OBJ create mode 100644 v2.0/bin/PROFILE.DOC create mode 100644 v2.0/bin/PROHST.EXE create mode 100644 v2.0/bin/PROHST.PAS create mode 100644 v2.0/bin/QUICK.DOC create mode 100644 v2.0/bin/README.DOC create mode 100644 v2.0/bin/RECOVER.COM create mode 100644 v2.0/bin/SORT.EXE create mode 100644 v2.0/bin/SYS.COM create mode 100644 v2.0/bin/SYSCALL.DOC create mode 100644 v2.0/bin/SYSIMES.OBJ create mode 100644 v2.0/bin/SYSINIT.DOC create mode 100644 v2.0/bin/SYSINIT.OBJ create mode 100644 v2.0/bin/UTILITY.DOC create mode 100644 v2.0/source/ALLOC.ASM create mode 100644 v2.0/source/ANSI.txt create mode 100644 v2.0/source/BUF.ASM create mode 100644 v2.0/source/CHKDSK.ASM create mode 100644 v2.0/source/CHKMES.ASM create mode 100644 v2.0/source/CHKPROC.ASM create mode 100644 v2.0/source/COMEQU.ASM create mode 100644 v2.0/source/COMLINK create mode 100644 v2.0/source/COMMAND.ASM create mode 100644 v2.0/source/COMSEG.ASM create mode 100644 v2.0/source/COMSW.ASM create mode 100644 v2.0/source/CONFIG.txt create mode 100644 v2.0/source/COPY.ASM create mode 100644 v2.0/source/COPYPROC.ASM create mode 100644 v2.0/source/CPARSE.ASM create mode 100644 v2.0/source/CTRLC.ASM create mode 100644 v2.0/source/DEBASM.ASM create mode 100644 v2.0/source/DEBCOM1.ASM create mode 100644 v2.0/source/DEBCOM2.ASM create mode 100644 v2.0/source/DEBCONST.ASM create mode 100644 v2.0/source/DEBDATA.ASM create mode 100644 v2.0/source/DEBEQU.ASM create mode 100644 v2.0/source/DEBMES.ASM create mode 100644 v2.0/source/DEBUASM.ASM create mode 100644 v2.0/source/DEBUG.ASM create mode 100644 v2.0/source/DEV.ASM create mode 100644 v2.0/source/DEVDRIV.txt create mode 100644 v2.0/source/DEVSYM.ASM create mode 100644 v2.0/source/DIR.ASM create mode 100644 v2.0/source/DIRCALL.ASM create mode 100644 v2.0/source/DISK.ASM create mode 100644 v2.0/source/DISKCOPY.ASM create mode 100644 v2.0/source/DISKMES.ASM create mode 100644 v2.0/source/DOSLINK create mode 100644 v2.0/source/DOSMAC.ASM create mode 100644 v2.0/source/DOSMAC_v211.ASM create mode 100644 v2.0/source/DOSMES.ASM create mode 100644 v2.0/source/DOSSEG.ASM create mode 100644 v2.0/source/DOSSYM.ASM create mode 100644 v2.0/source/DOSSYM_v211.ASM create mode 100644 v2.0/source/EDLIN.ASM create mode 100644 v2.0/source/EDLMES.ASM create mode 100644 v2.0/source/EDLPROC.ASM create mode 100644 v2.0/source/EXE2BIN.ASM create mode 100644 v2.0/source/EXEC.ASM create mode 100644 v2.0/source/EXEMES.ASM create mode 100644 v2.0/source/FAT.ASM create mode 100644 v2.0/source/FC.ASM create mode 100644 v2.0/source/FCB.ASM create mode 100644 v2.0/source/FCMES.ASM create mode 100644 v2.0/source/FIND.ASM create mode 100644 v2.0/source/FINDMES.ASM create mode 100644 v2.0/source/FORMAT.ASM create mode 100644 v2.0/source/FORMAT.txt create mode 100644 v2.0/source/FORMES.ASM create mode 100644 v2.0/source/GENFOR.ASM create mode 100644 v2.0/source/GETSET.ASM create mode 100644 v2.0/source/HRDDRV.ASM create mode 100644 v2.0/source/IFEQU.ASM create mode 100644 v2.0/source/INCOMP.txt create mode 100644 v2.0/source/INIT.ASM create mode 100644 v2.0/source/INT24.txt create mode 100644 v2.0/source/MISC.ASM create mode 100644 v2.0/source/MORE.ASM create mode 100644 v2.0/source/MOREMES.ASM create mode 100644 v2.0/source/MSCODE.ASM create mode 100644 v2.0/source/MSDATA.ASM create mode 100644 v2.0/source/MSDOS.ASM create mode 100644 v2.0/source/MSHEAD.ASM create mode 100644 v2.0/source/MSINIT.ASM create mode 100644 v2.0/source/PCLOCK.ASM create mode 100644 v2.0/source/PRINT.ASM create mode 100644 v2.0/source/PRINT_v211.ASM create mode 100644 v2.0/source/PROC.ASM create mode 100644 v2.0/source/PROFIL.ASM create mode 100644 v2.0/source/PROFILE.txt create mode 100644 v2.0/source/PROHST.HLP create mode 100644 v2.0/source/QUICK.txt create mode 100644 v2.0/source/RDATA.ASM create mode 100644 v2.0/source/README.txt create mode 100644 v2.0/source/RECMES.ASM create mode 100644 v2.0/source/RECOVER.ASM create mode 100644 v2.0/source/ROM.ASM create mode 100644 v2.0/source/RUCODE.ASM create mode 100644 v2.0/source/SKELIO.ASM create mode 100644 v2.0/source/SORT.ASM create mode 100644 v2.0/source/SORTMES.ASM create mode 100644 v2.0/source/STDBUF.ASM create mode 100644 v2.0/source/STDCALL.ASM create mode 100644 v2.0/source/STDCTRLC.ASM create mode 100644 v2.0/source/STDFCB.ASM create mode 100644 v2.0/source/STDIO.ASM create mode 100644 v2.0/source/STDPROC.ASM create mode 100644 v2.0/source/STDSW.ASM create mode 100644 v2.0/source/STRIN.ASM create mode 100644 v2.0/source/SYS.ASM create mode 100644 v2.0/source/SYSCALL.ASM create mode 100644 v2.0/source/SYSCALL.txt create mode 100644 v2.0/source/SYSIMES.ASM create mode 100644 v2.0/source/SYSINIT.ASM create mode 100644 v2.0/source/SYSINIT.txt create mode 100644 v2.0/source/SYSMES.ASM create mode 100644 v2.0/source/TCODE.ASM create mode 100644 v2.0/source/TCODE2.ASM create mode 100644 v2.0/source/TCODE3.ASM create mode 100644 v2.0/source/TCODE4.ASM create mode 100644 v2.0/source/TCODE5.ASM create mode 100644 v2.0/source/TDATA.ASM create mode 100644 v2.0/source/TIME.ASM create mode 100644 v2.0/source/TSPC.ASM create mode 100644 v2.0/source/TUCODE.ASM create mode 100644 v2.0/source/UINIT.ASM create mode 100644 v2.0/source/UTILITY.txt create mode 100644 v2.0/source/WSBAUD.BAS create mode 100644 v2.0/source/WSMSGS.OVR create mode 100644 v2.0/source/WSOVLY1.OVR create mode 100644 v2.0/source/XENIX.ASM create mode 100644 v2.0/source/XENIX2.ASM diff --git a/v2.0/bin/ANSI.DOC b/v2.0/bin/ANSI.DOC new file mode 100644 index 0000000000000000000000000000000000000000..040d9d279d0fa3aa3f6b937977ec50a3755cdbca GIT binary patch literal 6784 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 literal 0 HcmV?d00001 diff --git a/v2.0/bin/CHKDSK.COM b/v2.0/bin/CHKDSK.COM new file mode 100644 index 0000000000000000000000000000000000000000..152bc38d6d0cc92c85818848feaa461589eec64a GIT binary patch literal 6330 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 literal 0 HcmV?d00001 diff --git a/v2.0/bin/COMMAND.COM b/v2.0/bin/COMMAND.COM new file mode 100644 index 0000000000000000000000000000000000000000..820f39322f00e0cecd52568ac5505b8d1611b552 GIT binary patch literal 15480 zcmeHudsq}#w(qWfR6n2_5XDE7ZX&dgYLL)|Ot3)-f|4k-KoA6Fh_sP}mra$4nIzN3 zIYzoXjA!QLOlBqz1SgY0l4+Apf^7n5JD~9}QIi-GCpju6*_Dck5d|UIb=R&2G&%Qv z_xtX5zc1&HvF)y^U3;&+_u6Z($8Rr$T0QzH|M_FI=?cV7OIIT{+W)L3U5nT-f3qe% z46#c8R*lhw)haQ1=h5a9Z@a1fIM?5OEBoV;+MHV9@96uTN19Lj4E=G#v{frftWtPh zVY}E%H)s+3=+L%|8X!ma(KYbaol&JloKpA)8ad|2gm8z_o$)YKh>+`XTK_j1{H#(8 z`c+!IEA);F-<_aMYKuXgXhnaV(L_ig)J(su_vQA-@v*bDK1YAtZl^XxU196#rK_}* zlw{H-{hF44;TK2Y!^Ev>1n!7 zn-08D`I7qM$V4UJ!R-=WL*XUVqL>G?Y)miBXem5^@Pbf*8pl%NYqMj;ysmLxcM$|9u*K zkm}Tg_s0dY{VCc`l-?iL7@4j@9PK}?5w6_8??~e3{Aqtfgzac2x(B2za=$h)wi)>8 zN0e`If1K$#2N`F{^Dfn*gKVsSx(4r*#C>v=E=2AB>)h)n1l!41l*iA1ZwmN%Md$4a z{c-+xsLt8s`l6~c9mEoM@<=Xv?spg-#M#(dKABa{Qpkl zXOY~R)%jnheY*ZQG1~tEjh{m93|M-W#*YPsO+o)<8rLIv4!8=1n|;V$&1MA;+g)rr z{8nHFw>x{Q99Zls^2chE1<2cSGazej&ae?p(5zo5USSG%fNr@6sZ z&pOv%xu>$q%+*z2$*X70E@x%c2q{=!Ut3#QSJkq#l07FsSJu>+H`KdoE3Xtfonl^n zUESRMDS97HR$eQK5rO<$M@(7H; z?7Wj)s_VWqSGlS;JI$E}kGaaZxq7|RJg%z^`gn6z{>qh^d56s~g!=WBY;}EIi+MwJ zjkCq&s&}l#D{HE&?nr`elJAx;WLgiKtLs|EhSgH#B!g$=VSb(rd@(n& zuIh)K=E}M)=7*hI%#Unz*2&D<;!Q4cx@xQIDp}{x%n#K+V4hpLAaCB{mh6)3EMP%( z4d-%tv+t~~GegNjuftXUpsTXh%+}YNAE2iDeBH#Sz+J!sAf zEs8m}j&-^kTu#<`IT^UU!R2%=+z6wpaSkT0yvyc%BRRFEzOw2LtGRJYBkQa+Z>+3g zofnc*8`(-13&qYy3ELm^rqsI@)>YOzz2ofuf4Ewy@kVenb}vceWk2!tf66$18a7m< zEl62&ssrWDnn3>!-U1-=y=GVZ^c7c~p52yqMhzv@`Zq{m$6e;QNxk z?dMv*?D%}e9BM1q?zW<^9+nQ$vm(T>&f|Ky;U~&NZBz8kJwNbJqI>C4WBD$3#;gdi z>y}>Hh{{{akuR-vomREPzJ$H~M(AC1EN$w35p_L}_U}T2drX!#Bf8$EjcB!NaQ3w> zH|p>lNx3+X)wLCM*v(*{b!>DR-LB^r<_^s32shgsz_cnUdljearKd$u=RX!F+1GPX zO{q27UK;#Kxl|ZL=X->iR33k7RdGiy5Yho5^?*XWoYT8hLY)e5LR>lg=}xq?KW^xd zo6`^nLtMBkWyt-mvXg>R{{6DDRr{65c4o{+;y>|a_s30qp?>MWTA@Vh1@@pHa|e1c zuPfykh%BCL3IBrP6gjzrd-#~x2-+n3MkbemKTWzUT{n;@ zj0FAm2;vGrBSH-t4(<^z2aK&NIz{{f{xB zcb?wc`3^-cJ7Z&ze~qFu3A`cA?ikdTpe04%^0jS*yXhbUv)~)2?@rP3sj(6AlI=WA zo0@yrnMPBWIf7n|Pa%GoHdSaE^`y$y-s5_ssiR%r!;KnE2LeP!MBlyraiQhD?SLK; zce*)tie8o)+Ylez-vV=h2;keRc+pT3IKiO^K;xe)&y-9GaTN!Ya!XfEn^oJ~V}l4n z3&lF$^!_+-wzLsl+6dVL1}}S`esHf}8zHmLr44aUjQyco*Vz)&Ha%i@xwh@L2q|`Y zgkZSh&S=*!U{&@7tioO%z-r`55;J#Q$8#aXn4-5ytBO~5;6-SeB`sUx6z2yk)|Im1 zt8g4DwYbv}cNV;64If;M!;z?3jrFLM8F_jn;7u15DLwlUb@|nRz0yV7AA3Y$H3t?f z%`OIokT7L9Y6fzLT2~A?qj~m&|N#>NK

l~3LBj3t2b0T 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 literal 0 HcmV?d00001 diff --git a/v2.0/bin/CONFIG.DOC b/v2.0/bin/CONFIG.DOC new file mode 100644 index 0000000000000000000000000000000000000000..bfb1985d1d3255b5c2e23cbc5dc13efa600fb0e9 GIT binary patch literal 3456 zcmb7H+iu%N5bd)7{lg$Hi2>P8^HcqP7HBN}9eDSdmLSd#FxSI!}t)p#Ak`dB+}(>QVD|uP^tlso)jiQZzT6 z7@JpZf%uZ5s)!129<>hyN3iOjD{7RFCT}a{$+q=gdvfJ;Qs_sM>)r@??cn`ckpdk7 z3ilL{+L#;MOa6kgrlScIP9f@=o=iNtHj@4ty`m@QAFdc{cKx02lc>7ihHRE(AOQK5yotI@L}2w03p!c~QbE`Rx*8t-x);F-O%ed(l#x10-e<;H{u zO2%kX9)TFY>$NJx5q<^|95Rr$u00&_JFw=u*`8kvz4m(%^ico zJ>$2|-w>`yz&@!tRn8vh@3wBZe_S5B%GTMAJU}%T+zcRX!7Q57qw+?_lQfe<@ymS( z^G)cBwt>)vvwBEqPASZ@INLwJ3u7gG|8eb#w$iC|WYDLOilg+D=v8Q&rZV6&?a|G< zY;nKYZdSVs^LnHVF?UWB6B@PJqNGXfe-h~`R^QWvt}vZtX5|Mvy$*J5bG8brtK9MRp?T+6>kjApF2jHu z-t-OSj*`5YG^N%GFzq2-bPcXuzr%m;dAp2RrH`bYUSo8%#h&MKI&R8yG>$-~6r8u; zXdiTi@zn)%%voN{XMq5)h=KI>+}~`pPw}w>OoXeFQpzeVbxZ`OGPI;HUKa3awC5v2 zUJ4jC;)&x%Vu`ULjCG77y8XDkz5TBV-Rpy_@~=9_9>r1EIf6EW^RJ?7E-Nq|D%FY7 zm`ry|IDbKC`{dS((A%zJ)NA*#3g>~>Q`^Ys;l7&-zj}WmrbWG%&neUkE&|5oKk&0 ztRA>MhocwG0^prqOeg$|6*4`CJiuAEIl8vW?Zd}Ok4lOGzi&Vge!s>_tO3{XfRB@O zd=80q4<$89=m9YIW-GZP1R>aS$2g;VokA55PF!3V1?eIs3W27WGTtbxIwCz3JxIb{r<29z?ry%mxx)7g Ju>U9i`WJNiAo>6R literal 0 HcmV?d00001 diff --git a/v2.0/bin/CREF.EXE b/v2.0/bin/CREF.EXE new file mode 100644 index 0000000000000000000000000000000000000000..a88c2fa3233dcb00e01dca8140b1f6c1fec2242d GIT binary patch literal 13824 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 literal 0 HcmV?d00001 diff --git a/v2.0/bin/DEVDRIV.DOC b/v2.0/bin/DEVDRIV.DOC new file mode 100644 index 0000000..3c82793 --- /dev/null +++ b/v2.0/bin/DEVDRIV.DOC @@ -0,0 +1,802 @@ + MS-DOS 2.0 Device Drivers + +INTRODUCTION + + In the past, DOS-device driver (BIOS for those who are +familiar with CP/M) communication has been mediated with +registers and a fixed-address jump-table. This approach +has suffered heavily from the following two observations: + + o The old jump-table ideas of the past are fixed in + scope and allow no extensibility. + + o The past device driver interfaces have been written + without regard for the true power of the hardware. + When a multitasking system or interrupt driven + hardware is installed a new BIOS must be written + largely from scratch. + + In MSDOS 2.0, the DOS-device driver interface has changed +from the old jump-table style to one in which the device +drivers are linked together in a list. This allows new +drivers for optional hardware to be installed (and even +written) in the field by other vendors or the user himself. +This flexibility is one of the major new features of MS-DOS +2.0. + + Each driver in the chain defines two entry points; the +strategy routine and the interrupt routine. The 2.0 DOS +does not really make use of two entry points (it simply calls +strategy, then immediately calls interrupt). This dual entry +point scheme is designed to facilitate future multi-tasking +versions of MS-DOS. In multi-tasking environments I/O must +be asynchronous, to accomplish this the strategy routine +will be called to queue (internally) a request and return +quickly. It is then the responsibility of the interrupt +routine to perform the actual I/O at interrupt time by picking +requests off the internal queue (set up by the strategy +routine), and process them. When a request is complete, +it is flagged as "done" by the interrupt routine. The DOS +periodically scans the list of requests looking for ones +flagged as done, and "wakes up" the process waiting for the +completion of the request. + + In order for requests to be queued as above it is no +longer sufficient to pass I/O information in registers, since +many requests may be pending at any one time. Therefore +the new device interface uses data "packets" to pass request +information. A device is called with a pointer to a packet, +this packet is linked into a global chain of all pending +I/O requests maintained by the DOS. The device then links +the packet into its own local chain of requests for this +particular device. The device interrupt routine picks +requests of the local chain for processing. The DOS scans +the global chain looking for completed requests. These +packets are composed of two pieces, a static piece which +has the same format for all requests (called the static +request header), which is followed by information specific +to the request. Thus packets have a variable size and format. + + At this points it should be emphasized that MS-DOS 2.0 +does not implement most of these features, as future versions +will. There is no global or local queue. Only one request +is pending at any one time, and the DOS waits for this current +request to be completed. For 2.0 it is sufficient for the +strategy routine to simply store the address of the packet +at a fixed location, and for the interrupt routine to then +process this packet by doing the request and returning. +Remember: the DOS just calls the strategy routine and then +immediately calls the interrupt routine, it is assumed that +the request is completed when the interrupt routine returns. +This additional functionality is defined at this time so +that people will be aware and thinking about the future. + + +FORMAT OF A DEVICE DRIVER + + A device driver is simply a relocatable memory image +with all of the code in it to implement the device (like +a .COM file, but not ORGed at 100 Hex). In addition it has +a special header at the front of it which identifies it as +a device, defines the strategy and interrupt entry points, +and defines various attributes. It should also be noted +that there are two basic types of devices. + + The first is character devices. These are devices which +are designed to do character I/O in a serial manner like +CON, AUX, and PRN. These devices are named (ie. CON, AUX, +CLOCK, etc.), and users may open channels (FCBs) to do I/O +to them. + + The second class of devices is block devices. These +devices are the "disk drives" on the system, they can do +random I/O in pieces called blocks (usually the physical +sector size) and hence the name. These devices are not +"named" as the character devices are, and therefore cannot +be "opened" directly. Instead they are "mapped" via the +drive letters (A,B,C, etc.). + + Block devices also have units. In other words a single +driver may be responsible for one or more disk drives. For +instance block device driver ALPHA (please note that we cannot +actually refer to block devices by a name!) may be +responsible for drives A,B,C and D, this simply means that +it has four units (0-3) defined and therefore takes up four +drive letters. Which units correspond to which drive letters +is determined by the position of the driver in the chain +of all drivers: if driver ALPHA is the first block driver +in the device chain, and it defines 4 units (0-3), then they +will be A,B,C and D. If BETA is the second block driver +and defines three units (0-2), then they will be E,F and +G and so on. MS-DOS 2.0 is not limited to 16 block device +units, as previous versions were. The theoretical limit +is 63 (2^6 - 1), but it should be noted that after 26 the +drive letters get a little strange (like ] \ and ^). NOTE: +Character devices cannot define multiple units (this because +they have only one name). + + +Here is what that special device header looks like: + + +--------------------------------------+ + | DWORD Pointer to next device | + | (Must be set to -1) | + +--------------------------------------+ + | WORD Attributes | + | Bit 15 = 1 if char device 0 if blk | + | if bit 15 is 1 | + | Bit 0 = 1 if Current sti device | + | Bit 1 = 1 if Current sto output | + | Bit 2 = 1 if Current NUL device | + | Bit 3 = 1 if Current CLOCK dev | + | Bit 4 = 1 if SPECIAL | + | Bit 14 is the IOCTL bit (see below) | + | Bit 13 is the NON IBM FORMAT bit | + +--------------------------------------+ + | WORD Pointer to Device strategy | + | entry point | + +--------------------------------------+ + | WORD Pointer to Device interrupt | + | entry point | + +--------------------------------------+ + | 8-BYTE character device name field | + | Character devices set a device name | + | For block devices the first byte is | + | The number of units | + +--------------------------------------+ + + Note that the device entry points are words. They must +be offsets from the same segment number used to point to +this table. Ie. if XXX.YYY points to the start of this +table, then XXX.strategy and XXX.interrupt are the entry +points. + + A word about the Attribute field. This field is used +most importantly to tell the system whether this device is +a block or character device (bit 15). Most of other bits +are used to give selected character devices certain special +treatment (NOTE: these bits mean nothing on a block device). +Let's say a user has a new device driver which he wants to +be the standard input and output. Besides just installing +the driver he needs to tell SYSINIT (and the DOS) that he +wishes his new driver to override the current sti and sto +(the "CON" device). This is accomplished by setting the +attributes to the desired characteristics, so he would set +Bits 0 and 1 to 1 (note that they are separate!!). Similarly +a new CLOCK device could be installed by setting that +attribute, see the section at the end on the CLOCK device. +NOTE: that although there is a NUL device attribute, the +NUL device cannot be re-assigned. This attribute exists +for the DOS so that it can tell if the NUL device is being +used. + + The NON IBM FORMAT bit applies only to block devices +and effects the operation of the get BPB device call (see +below). + + The other bit of interest is the IOCTL bit which has +meaning on character or block devices. This bit tells the +DOS whether this device can handle control strings (via the +IOCTL system call). + + If a driver cannot process control strings, it should +initially set this bit to 0. This tells the DOS to return +an error if an attempt is made (via IOCTL system call) to +send or receive control strings to this device. A device +which can process control strings should initialize it to +1. For drivers of this type, the DOS will make calls to +the IOCTL INPUT and OUTPUT device functions to send and +receive IOCTL strings (see IOCTL in the SYSTEM-CALLS +document). + + The IOCTL functions allow data to be sent and received +by the device itself for its own use (to set baud rate, stop +bits, form length etc., etc.), instead of passing data over +the device channel as a normal read or write does. The +interpretation of the passed information is up to the device, +but it MUST NOT simply be treated as a normal I/O. + + The SPECIAL bit applies only to character drivers and +more particularly to CON drivers. The new 2.0 interface +is a much more general and consistent interface than the +old 1.25 DOS interface. It allows for a number of additional +features of 2.0. It is also slower than 1.25 if old style +"single byte" system calls are made. To make most efficient +use of the interface all applications should block their +I/O as much as possible. This means make one XENIX style +system call to output X bytes rather than X system calls +to output one byte each. Also putting a device channel in +RAW mode (see IOCTL) provides a means of putting out +characters even FASTER than 1.25. To help alleviate the +CON output speed problem for older programs which use the +1 - 12 system calls to output large amounts of data the +SPECIAL bit has been implemented. If this bit is 1 it means +the device is the CON output device, and has implemented +an interrupt 29 Hex handler, where the 29 Hex handler is +defined as follows: + + Interrupt 29h handlers + + Input: + Character in AL + + Function: + output the character in al to the user + screen. + Output: + None + Registers: + all registers except bx must be preserved. + No registers except for al have a known or + consistent value. + + If a character device implements the SPECIAL bit, it +is the responsibility of the driver to install an address +at the correct location in the interrupt table for interrupt +29 Hex as part of its INIT code. IMPLICATION: There can +be only one device driver with the SPECIAL bit set in the +system. There is no check to insure this state. + +WARNING: THIS FEATURE WILL NOT BE SUPPORTED IN FUTURE VERSIONS + OF THE OPERATING SYSTEM. IMPLICATION: Any application + (not device driver) which uses INT 29H directly will + not work on future versions, YOU HAVE BEEN WARNED. + + In order to "make" a device driver that SYSINIT can +install, a memory image or .EXE (non-IBM only) format file +must be created with the above header at the start. The +link field should be initialized to -1 (SYSINIT fills it +in). The attribute field and entry points must be set +correctly, and if the device is a character device, the name +field must be filled in with the name (if a block device +SYSINIT will fill in the correct unit count). This name +can be any 8 character "legal" file name. In fact SYSINIT +always installs character devices at the start of the device +list, so if you want to install a new CON device all you +have to do is name it "CON". The new one is ahead of the +old one in the list and thus preempts the old one as the +search for devices stops on the first match. Be sure to +set the sti and sto bits on a new CON device! + +NOTE: Since SYSINIT may install the driver anywhere, you + must be very careful about FAR memory references. You + should NOT expect that your driver will go in the same + place every time (The default BIOS drivers are exempted + from this of course). + + +INSTALLATION OF DEVICE DRIVERS + + Unlike past versions MS-DOS 2.0 allows new device drivers +to be installed dynamically at boot time. This is +accomplished by the new SYSINIT module supplied by Microsoft, +which reads and processes the CONFIG.SYS file. This module +is linked together with the OEM default BIOS in a similar +manner to the way FORMAT is built. + + One of the functions defined for each device is INIT. +This routine is called once when the device is installed, +and never again. The only thing returned by the init routine +is a location (DS:DX) which is a pointer to the first free +byte of memory after the device driver, (like a terminate +and stay resident). This pointer method can be used to "throw +away" initialization code that is only needed once, saving +on space. + + Block devices are installed the same way and also return +a first free byte pointer as above, additional information +is also returned: + + o The number of units is returned, this determines + logical device names. If the current maximum logical + device letter is F at the time of the install call, + and the init routine returns 4 as the number of units, + then they will have logical names G, H, I and J. + This mapping is determined by by the position of + the driver in the device list and the number of units + on the device (stored in the first byte of the device + name field). + + o A pointer to a BPB (Bios Parameter Block) pointer + array is also returned. This will be similar to + the INIT table used in previous versions, but will + have more information in it. There is one table + for each unit defined. These blocks will be used + to build a DPB (Drive Parameter Block) for each of + the units. The pointer passed to the DOS from the + driver points to an array of n word pointers to BPBs + where n is the number of units defined. In this + way if all units are the same, all of the pointers + can point to the same BPB, saving space. NOTE: this + array must be protected (below the free pointer set + by the return) since the DPB will be built starting + at the byte pointed to by the free pointer. The + sector size defined must be less than or equal to + the maximum sector size defined at default BIOS init + time. If it isn't the install will fail. One new + piece of DPB info set from this table will be a "media + descriptor byte". This byte means nothing to the + DOS, but is passed to devices so that they know what + form of a DPB the DOS is currently using for a + particular Drive-Unit. + + Block devices may take several approaches; they may be +dumb or smart. A dumb device would define a unit (and +therefore a DPB) for each possible media drive combination. +Unit 0 = drive 0 single side, unit 1 = drive 0 double side, +etc. For this approach media descriptor bytes would mean +nothing. A smart device would allow multiple media per unit, +in this case the BPB table returned at init must define space +large enough to accommodate the largest possible media +supported. Smart drivers will use the "media byte" to pass +around info about what media is currently in a unit. NOTE: +If the DPB is a "hybrid" made to get the right sizes, it +should give an invalid "media byte" back to the DOS. + + The BOOT (default BIOS) drivers are installed pretty +much as above. The preset device list is scanned. If block +drivers are encountered they are installed as above (with +the exception that the break is not moved since the drivers +are already resident in the BIOS). Note that the logical +drive letters are assigned in list order, thus the driver +which is to have logical A must be the first unit of the +first block device in the list. The order of character +devices is also important. There must be at least 4 character +devices defined at boot which must be the first four devices +(of either type), the first will become standard input, +standard output, and standard error output. The second will +become standard auxiliary input and output, the third will +become standard list output, and the forth will become the +date/time (CLOCK) device. Thus the BIOS device list must +look like this: + +->CON->AUX->PRN->CLOCK->any other block or character devices + +THE DRIVER + + A device driver will define the following functions: + + Command Function + Code + + 0 INIT + 1 MEDIA CHECK (Block only, NOP for character) + 2 BUILD BPB " " " " " + 3 IOCTL INPUT (Only called if device has IOCTL) + 4 INPUT (read) + 5 NON-DESTRUCTIVE INPUT NO WAIT (Char devs only) + 6 INPUT STATUS " " " + 7 INPUT FLUSH " " " + 8 OUTPUT (write) + 9 OUTPUT (Write) with verify + 10 OUTPUT STATUS " " " + 11 OUTPUT FLUSH " " " + 12 IOCTL OUTPUT (Only called if device has IOCTL) + + As mentioned before, the first entry point is the strategy +routine which is called with a pointer to a data block. This +call does not perform the request, all it does is queue it +(save the data block pointer). The second interrupt entry +point is called immediately after the strategy call. The +"interrupt" routine is called with no parameters, its primary +function is to perform the operation based on the queued +data block and set up any returns. + + The "BUILD BPB" and "MEDIA CHECK" are the interesting +new ones, these are explained by examining the sequence of +events in the DOS which occurs when a drive access call (other +than read or write) is made: + + I. Turn drive letter into DPB pointer by looking + for DPB with correct driver-unit number. + + II. Call device driver and request media check for + Drive-Unit. DOS passes its current Media + descriptor byte (from DPB). Call returns: + + Media Not Changed + Media Changed + Not Sure + Error + + Error - If an error occurs the error code should + be set accordingly. + + Media Not changed - Current DPB and media byte + are OK, done. + + Media Changed - Current DPB and media are wrong, + invalidate any buffers for this unit, and + goto III. + + Not Sure - If there are dirty buffers for this + unit, assume DPB and media byte are OK and + done. If nothing dirty, assume media changed, + invalidate any buffers for unit, and goto + III. + + NOTE: If a hybrid DPB was built at init and + an invalid Media byte was set, the driver + should return media changed when this invalid + media byte is encountered. + + III. Call device driver to build BPB with media byte + and buffer. + + What the driver must do at step III is determine the +correct media that is currently in the unit, and return a +pointer to a BPB table (same as for the install call). This +table will be used as at init to build a correct DPB for +the unit If the determined media descriptor byte in the table +turns out to be the same as the one passed in, then the DOS +will not build a new table, but rather just use the old one. +Therefore in this case the driver doesn't have to correctly +fill in the other entries if desired. + + The build BPB call also gets a pointer to a one sector +buffer. What this buffer contains is determined by the NON +IBM FORMAT bit in the attribute field. If the bit is zero +(device is IBM format compatible) then the buffer contains +the first sector of the first FAT, in particular the FAT +ID byte is the first byte of this buffer. NOTE: It must +be true that the BPB is the same, as far as location of the +FAT is concerned, for all possible media. This is because +this first FAT sector must be read BEFORE the actual BPB +is returned. If the NON IBM FORMAT bit is set then the +pointer points to one sector of scratch space which may be +used for anything. + +CALL FORMAT + + When the DOS calls a device driver to perform a finction, +it passes a structure (Drive Request Structure) in ES:BX +to perform operations and does a long call to the driver's +strategy entry point. This structure is a fixed length header +(Static Request Header) followed by data pertinent to the +operation being performed. NOTE: It is the drivers +responsibility to preserve machine state. + +STATIC REQUEST HEADER -> + +-----------------------------+ + | BYTE length of record | + | Length in bytes of this | + | Drive Request Structure | + +-----------------------------+ + | BYTE unit code | + | The subunit the operation | + | is for (minor device) | + | (no meaning on character | + | devices) | + +-----------------------------+ + | BYTE command code | + +-----------------------------+ + | WORD Status | + +-----------------------------+ + | 8 bytes reserved here for | + | two DWORD links. One will | + | be a link for the DOS queue | + | The other for the device | + | queue | + +-----------------------------+ + +STATUS WORD + + 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 + +---+---+--+--+--+--+---+---+--+--+--+--+--+--+--+--+ + | E | | B | D | | + | R | RESERVED | U | O | ERROR CODE (bit 15 on)| + | R | | I | N | | + +---+---+--+--+--+--+---+---+--+--+--+--+--+--+--+--+ + + The status word is zero on entry and is set by the driver +interrupt routine on return. + + Bit 8 is the done bit, it means the operation is complete. +For the moment the Driver just sets it to one when it exits, +in the future this will be set by the interrupt routine to +tell the DOS the operation is complete. + + Bit 15 is the error bit, if it is set then the low 8 +bits indicate the error: + + 0 Write Protect violation + (NEW) 1 Unknown Unit + 2 Drive not ready + (NEW) 3 Unknown command + 4 CRC error + (NEW) 5 Bad Drive Request Structure length + 6 Seek error + (NEW) 7 Unknown media + 8 Sector not found + (NEW) 9 Printer out of paper + A Write Fault + (NEW) B Read Fault + C General Failure + +Bit 9 is the busy bit which is set only by status calls (see +STATUS CALL below). + + + Here is the data block format for each function: + +READ or WRITE - ES:BX (Including IOCTL) -> + +------------------------------------+ + | 13-BYTE Static Request Header | + +------------------------------------+ + | BYTE Media descriptor from DPB | + +------------------------------------+ + | DWORD transfer address | + +------------------------------------+ + | WORD byte/sector Count | + ---+------------------------------------+--- + | WORD starting sector number | + | (ignored on Char Devs) | + +------------------------------------+ + + In addition to setting the status word, the driver must +set the Sector count to the actual number of sectors (or +bytes) transferred. NOTE: No error check is performed on +an IOCTL I/O call, driver MUST correctly set the return sector +(byte) count to the actual number of bytes transferred, +however. + +NOTE: THE FOLLOWING APPLIES TO BLOCK DEVICE DRIVERS. + + Under certain circumstances the BIOS may be asked to +do a write operation of 64K bytes which seems to be a "wrap +around" of the transfer address in the BIOS I/O packet. This +arises due to an optimization added to the write code in +MS-DOS. It will only manifest on user WRITEs which are within +a sector size of 64K bytes on files which are "growing" past +the current EOF. IT IS ALLOWABLE FOR THE BIOS TO IGNORE +THE BALANCE OF THE WRITE WHICH "WRAPS AROUND" IF IT SO +CHOOSES. For instance a WRITE of 10000H bytes worth of +sectors with a transfer address of XXX:1 could ignore the +last two bytes (remember that a user program can never request +an I/O of more than FFFFH bytes and cannot wrap around (even +to 0) in his transfer segment, so in this case the last two +bytes can be ignored). + + +NON DESRUCTIVE READ NO WAIT - ES:BX -> + +------------------------------------+ + | 13-BYTE Static Request Header | + +------------------------------------+ + | BYTE read from device | + +------------------------------------+ + + This call is analogous to the console input status call +on MS-DOS 1.25. If the character device returns Busy bit += 0 (characters in buffer), then the next character that +would be read is returned. This character is NOT removed +from the input buffer (hence the term Non Destructive Read). +In essence this call allows the DOS to look ahead one input +character. + + +MEDIA CHECK - ES:BX -> + +------------------------------------+ + | 13-BYTE Static Request Header | + +------------------------------------+ + | BYTE Media Descriptor from DPB | + +------------------------------------+ + | BYTE returned | + +------------------------------------+ + + In addition to setting status word, driver must set the +return byte. + + Return Byte : + -1 Media has been changed + 0 Don't know if media has been changed + 1 Media has not been changed + + If the driver can return -1 or 1 (by having a door-lock +or other interlock mechanism) the performance of MSDOS 2.0 +is enhanced as the DOS need not reread the FAT for each +directory access. + + +BUILD BPB - ES:BX -> + +------------------------------------+ + | 13-BYTE Static Request Header | + +------------------------------------+ + | BYTE Media Descriptor from DPB | + +------------------------------------+ + | DWORD Transfer Address | + | (points to one sectors worth of | + | scratch space or first sector | + | of FAT depending on the value | + | of the NON IBM FORMAT bit) | + +------------------------------------+ + | DWORD Pointer to BPB | + +------------------------------------+ + + If the NON IBM FORMAT bit of the device is set, then +the DWORD Transfer Address points to a one sector buffer +which can be used for any purpose. If the NON IBM FORMAT +bit is 0, then this buffer contains the first sector of the +FAT; in this case the driver must not alter this buffer (this +mode is useful if all that is desired is to read the FAT +ID byte). + + If IBM compatible format is used (NON IBM FORMAT BIT += 0), then it must be true that the first sector of the first +FAT is located at the same sector on all possible media. +This is because the FAT sector will be read BEFORE the media +is actually determined. + + In addition to setting status word, driver must set the +Pointer to the BPB on return. + + + In order to allow for many different OEMs to read each +other's disks, the following standard is suggested: The +information relating to the BPB for a particular piece of +media is kept in the boot sector for the media. In +particular, the format of the boot sector is: + + +------------------------------------+ + | 3 BYTE near JUMP to boot code | + +------------------------------------+ + | 8 BYTES OEM name and version | + ---+------------------------------------+--- + B | WORD bytes per sector | + P +------------------------------------+ + B | BYTE sectors per allocation unit | + +------------------------------------+ + | | WORD reserved sectors | + V +------------------------------------+ + | BYTE number of FATs | + +------------------------------------+ + | WORD number of root dir entries | + +------------------------------------+ + | WORD number of sectors in logical | + ^ | image | + | +------------------------------------+ + B | BYTE media descriptor | + P +------------------------------------+ + B | WORD number of FAT sectors | + ---+------------------------------------+--- + | WORD sectors per track | + +------------------------------------+ + | WORD number of heads | + +------------------------------------+ + | WORD number of hidden sectors | + +------------------------------------+ + + The three words at the end are optional, the DOS doesn't +care about them (since they are not part of the BPB). They +are intended to help the BIOS understand the media. Sectors +per track may be redundant (could be figured out from total +size of the disk). Number of heads is useful for supporting +different multi-head drives which have the same storage +capacity, but a different number of surfaces. Number of +hidden sectors is useful for supporting drive partitioning +schemes. + + + Currently, the media descriptor byte has been defined +for a small range of media: + + 5 1/4" diskettes: + + Flag bits: + 01h - on -> 2 double sided + + All other bits must be on. + + 8" disks: + FEh - IBM 3740 format, singled-sided, single-density, + 128 bytes per sector, soft sectored, 4 sectors + per allocation unit, 1 reserved sector, 2 FATs, + 68 directory entries, 77*26 sectors + + FDh - 8" IBM 3740 format, singled-sided, + single-density, 128 bytes per sector, soft + sectored, 4 sectors per allocation unit, 4 + reserved sectors, 2 FATs, 68 directory entries, + 77*26 sectors + + FEh - 8" Double-sided, double-density, 1024 bytes + per sector, soft sectored, 1 sector per allocation + unit, 1 reserved sector, 2 FATs, 192 directory + entries, 77*8*2 sectors + + +STATUS Calls - ES:BX -> + +------------------------------------+ + | 13-BYTE Static Request Header | + +------------------------------------+ + + All driver must do is set status word accordingly and +set the busy bit as follows: + + o For output on character devices: If it is 1 on + return, a write request (if made) would wait for + completion of a current request. If it is 0, there + is no current request and a write request (if made) + would start immediately. + + o For input on character devices with a buffer a return + of 1 means, a read request (if made) would go to + the physical device. If it is 0 on return, then + there are characters in the devices buffer and a + read would return quickly, it also indicates that + the user has typed something. The DOS assumes all + character devices have an input type ahead buffer. + Devices which don't have them should always return + busy = 0 so that the DOS won't hang waiting for + something to get into a buffer which doesn't exist. + + +FLUSH Calls - ES:BX -> + +------------------------------------+ + | 13-BYTE Static Request Header | + +------------------------------------+ + + This call tells the driver to flush (terminate) all +pending requests that it has knowledge of. Its primary use +is to flush the input queue on character devices. + + +INIT - ES:BX -> + +------------------------------------+ + | 13-BYTE Static Request Header | + +------------------------------------+ + | BYTE # of units | + +------------------------------------+ + | DWORD Break Address | + ---+------------------------------------+--- + | DWORD Pointer to BPB array | + | (not set by Character devices) | + +------------------------------------+ + + The number of units, break address, and BPB pointer are +set by the driver. + + +FORMAT OF BPB (Bios Parameter Block) - + + +------------------------------------+ + | WORD Sector size in Bytes | + | Must be at least 32 | + +------------------------------------+ + | BYTE Sectors/Allocation unit | + | Must be a power of 2 | + +------------------------------------+ + | WORD Number of reserved sectors | + | May be zero | + +------------------------------------+ + | BYTE Number of FATS | + +------------------------------------+ + | WORD Number of directory entries | + +------------------------------------+ + | WORD Total number of sectors | + +------------------------------------+ + | BYTE Media descriptor | + +------------------------------------+ + | WORD Number of sectors occupied by | + | FAT | + +------------------------------------+ + + +THE CLOCK DEVICE + + One of the most popular add on boards seems to be "Real +Time CLOCK Boards". To allow these boards to be integrated +into the system for TIME and DATE, there is a special device +(determined by the attribute word) which is the CLOCK device. +In all respects this device defines and performs functions +like any other character device (most functions will be "set +done bit, reset error bit, return). When a read or write +to this device occurs, exactly 6 bytes are transferred. This +I/O can be thought of as transferring 3 words which correspond +exactly to the values of AX, CX and DX which were used in +the old 1.25 DOS date and time routines. Thus the first +two bytes are a word which is the count of days since 1-1-80. +The third byte is minutes, the fourth hours, the fifth +hundredths of seconds, and the sixth seconds. Reading the +CLOCK device gets the date and time, writing to it sets the +date and time. + \ No newline at end of file diff --git a/v2.0/bin/DISKCOPY.COM b/v2.0/bin/DISKCOPY.COM new file mode 100644 index 0000000000000000000000000000000000000000..ea4e0d2fc91db189770c5b0a7b673573dc3a78a5 GIT binary patch literal 1419 zcmb7CU1-}@6xOvRC3S7bgb*4s?3>|r4Q;eFd05vPwk&BoZ!C7~(%R`DX!cF2#gUA3 zMrK4#cMrdI-_+byDq|0V$S9Vg^Ub;ze zx#yhkJLfx}RFyuvh*S-p6nbA}{{0x!eCbf7t8DzmktbHkeFMdiKKESR5{}*V$$E zHhYJ?$39{S`-J7W7Os;!%Be_92d}CU4nm}=iVB00JPy;UltZvT=yCObps4r+j3KP% zPr&fFtf=S>7`#Lo2xe6UqZAIlC8nV+(;h<#hIYq%J(W@>Cq+3O92BwGNQjvX98=Uu z5eMT4O;EhtGZ=}(w4_bYObSy0GVL*@=#)34z^s@>>i)DbQP1FDjJAi3>!8g#mV9NX zn=10S29#_bij;l@(KS4-Mux5<2*R@vQc>9q!pP$a)(Q5wgIt;>ZC+T`kcy$E=xPep z#UV`Bm1L|OSaX^J_hF5NFiJx#s^bVhm+(ATR7ILbH_5{Zl!sTZAh}_xy;NAvi5V%q zFGI_slr$!#L@X)tzW8`UH8mclk%lF?UaX6vO;uDkn0n-KL8yt7X#axe1e5 + XXXX:01E5 2F. + >w + Writing YYYY Bytes + >q + +If the byte at 1E5 is not 2F, look around in the immediate +vacinity (do d1e0) for it. It is the only 2F in that area. + + +The second is the location of the 24 bit user number and the +8 bit OEM number. These values are returned by the GET_VERSION +system call. +The user number is 3 bytes starting at +debug location 683, The OEM number is one byte at debug location +686. The user number is initialized to 0, the OEM number to -1 +and they immediatly follow the Microsoft Copyright message. If these +bytes are not zero, look for the four bytes following the +Copyright message which should be in the vacinity of 683. +OEMs should request an OEM number from Microsoft if they +want one of their very own, this prevents selecting one someone +else already has. + + +The third is the location of the editing template definitions. +This is a table which defines the two byte edit function keys +for system call 10 and for EDLIN. This table is at debug location +33EA, and should start with a 1B. If the byte at 33EA is not +1B, look around in the immediate vacinity. Here is what the +default table looks like. It is a definition for the Zenith +Z-19 terminal: + +ESCCHAR DB 1BH ;The Escape character, Nul (0) on IBM +ESCTAB: + DB "Z" ;5AH Put a ^Z in the template, F6 on IBM + DB "S" ;53H Copy one char, --> on IBM + DB "V" ;56H Skip one char, DEL on IBM + DB "T" ;54H Copy to char, F2 on IBM + DB "W" ;57H Skip to char, F4 on IBM + DB "U" ;55H Copy line, F3 on IBM + DB "E" ;45H Kill line, Not used on IBM + DB "J" ;4AH Reedit line, F5 on IBM + DB "D" ;44H Backspace, <-- on IBM + DB "P" ;50H Toggle insert mode, INS on IBM + DB "Q" ;51H Toggle insert mode, INS on IBM + DB "R" ;52H Escape char, F7 on IBM + DB "R" ;52H End of table, must be same as previos character + + \ No newline at end of file diff --git a/v2.0/bin/EDLIN.COM b/v2.0/bin/EDLIN.COM new file mode 100644 index 0000000000000000000000000000000000000000..81e097b969951ce42e33d46a9b8a2be220304f2f GIT binary patch literal 4389 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 literal 0 HcmV?d00001 diff --git a/v2.0/bin/EXE2BIN.EXE b/v2.0/bin/EXE2BIN.EXE new file mode 100644 index 0000000000000000000000000000000000000000..f4b0dd75e16d7697f38758d448d6d21cc20ecb6e GIT binary patch literal 1649 zcmeHGQD{?F82)e5M4Fn~G2GaY^i;CCZuT}bZ|*kQVx4_x>{@2K`ru-6vSw@Vjpv-J zRTNSLMJ@zieUjktLHeNOGVs=>)s8|bVeNu!R7BC2r1wGG#@KXA_TN;-#DT9eb}r|h zd;jzO-}nFD;q;9hg<5a{fjX#E_Cp%Xn}CDh{L=@p4ObcGmlD4IAOATA?7D-Land0N zgSkoYhvxguV7^(YIlaYieE^v?>kgQ8`R1l&!(RhV6cCVv_>Gb=Cd_H!^GKFfxfo z+?`TDe`b_(0Vuu$=`d!C9XW?}Bistb8nCw>xZ#GMzh3ymspnZl@%^Stzb{xpFgve7 zzL|M0r@(&mf@N2mS+<^n{i_v|>?hU?+;|rT4Sx#E-TCH2li?ZY8_^$S7r@;FozTb& z?>(qouPrRcyI5QOSPiWbEh!Nq_90qFVA-Rg(vv35z$*_d9-#3rrJtADv~U~z8+#KWnbLAFitvdw|RJ2&Cls5J7; ztB*Dw?~nHV^r?zZpE-BWXqdz1hm3Fv{F%Fj#n_;Ay z#;y)6Tid15{<75|mAcD)U7wDPY0>t+WQ=KCONjP^9l;K{XSfIC?%v32ay#9xs-stp zX^hdBAbSrCl4E!QlbRaXmmH%+)dWdsx*8Aks$5SblCdOJ1sSK~8auH8i7^@#m_R6F z8ha5JPx7w_Peo%Cu@h~2iW8O6IE|AwawN(r;q;4fhw%MTI?=j|1bp7-q*2w8K0--M zQ?VjJ+ylwm^PFKmQ^OaK4? literal 0 HcmV?d00001 diff --git a/v2.0/bin/FC.EXE b/v2.0/bin/FC.EXE new file mode 100644 index 0000000000000000000000000000000000000000..aa06624e8f5665076818a615348390fcad4535d7 GIT binary patch literal 2553 zcmeHI|8G-O6uTJW-e2~UKj=@2nV`#3U~jCB#VR z&gXtU=bU@)eYb5-PjPmHkb;)+mPL5P?Y$RV@DaKtGwc87zuW<{s3WY#l$y2G)dSUI zWp4f@XXYb3P&8JC>xSDubcv@DXr?bUT6^6)G%e2Dc+0h7@I}YjmPNhrTF|?6u!lJZ zmx6Qffq`{tG*)(MTBJ94^{M*z_25h&{hA-_#qLIJt@}}}%I(*x-2tt}U8BnGhvP-% zCAHrj=)>lPt#AH{GnaA7HHqm@_NUF0LkOAj5Qj|15RXh@NI)Z;W%gz^i7D4}q8aMh zOkd~KpGWM7T!e~}rAZ$@(7^Jm70DJGnQW#JUj1Y<)%gOa=Pw*PaLknrJkp9X3WQuM znyxLG926jmbdP;Ixk#V0r>%h}#>x_&UTkSX_B8}~NMI3}pdp)Dl5D~4uzChe({`Jx z03EUqDjwDsW-oCg_z31qkqtZja1RtRCq=-#mom_d?VIgr^B}F%Us3*?gBCEw+fXd z1I}as(|v+^wNTj{5Ej(W=_IEL=BA#6=P;~h#U&so_e&cN^y7zdAJ!cs z7&!Ez0JHQQ9}}{#qGTKciw-jH81u~jd?dY;ky&Swac45_$cJ(!_dCwwevDAUlZI@o znKZ$x7<5_P8o>aPI4CfyJ8#esuhxLxbg-mP&T(7wTr|gpW*4{*@#=$&n{Gfz6U^?p zMG0nG56g5X6bT1}1==JqV52~v5lmlCf!;7rU!Lb&B!GCJzc<$cjDYl7GO zbu*dW;g)rN%E%cB&oSuA;t>o(d*)jRm}7hTBfpJ|4;{ztsWY@1ZKJDE>MXq z8ZvOI$)b0mp;6pHCcxf7orp|lj^h(|AbOZL4%6V!rz1y{g3C|%Y>w$#lZ5YIy$xZFtVeH(| z5lGo+sg?R7Wv2_QdPBe3+;aIx^YRFO2gClni>*1%D=4-+)x^=4QA}tyZzeo2uY*+t z>xO|(D+S2TlyEd4jV{oWv-!xaOuUh!UJ$o1F~rru`m>lpAb$4`abmXKfKPL)#ZqK9 zTg@$SzF-%yyGY}6#*~rYh5QcW3@Rg)Gw2EwgExl^=mYV&Dld@Pv@|o(PbPJcG*7|y z!134ZFl`DX?j-vc0gYU&9M_gqUhu*lSP{S#0Y^nZst7nM0xlA8HL`eq+KSXw#lxD1 zwjnY_egLzCd@}jf3Cl`z1C4MsImySx=d``PQG-suB%%>%8x=M1!Q=ooJA?MRp#wjM!!PNo16a z*9{vR%!$NHmaP4}!Ti3RjHabq6aCwCv4xC#D^D9_oSg?+he*Il;u5_zODly_2xx5f~De}V& zNvkcmH(VB6IegFv!rII${y`26Y#1vG8vfergZ!M`=6$NWI~uBL>)NG8W6@5ns-vd5 zw(t)uu)!+W%HJMYYK`oQs%m(brZoBd%0BpC>xxFoTO<2I-Cetty&*NUC#;3ldL&Cr zn!CEgN+hZ&ol!lqyS}6`v|H%}%&|2LR#;V|s?rsyceO@95eaoG8yVzUwQ7~Zq%kF= zhLzo2otF?z=G?xGX literal 0 HcmV?d00001 diff --git a/v2.0/bin/FILBP.PAS b/v2.0/bin/FILBP.PAS new file mode 100644 index 0000000000000000000000000000000000000000..71decc88c6e2f3dc05b7fa80a79e62510bb2528e GIT binary patch literal 6144 zcmbVQZByIW74Bzd_z$Psw6ZsXV3JK(lVnQ3Y?ucdzjjE`8gIBhgW@L48eyrw_-}>6w zFQ)^VW6i^cX;~Eri*&5VyYx0c%i0Bq99&(+g;aO57$Fk+zq|qU-e|P{W zx%vE3hKDk~s{oH>d6QJ(bzBlJkI{piVazA81E${Q{LUwhu>ruR?J z_X7U-9Y41C<44b5b&2=H^TqocFMr|X@4Wn(m%s9|!OOpS`IQ%Z?$dX;-sR;rFK>BS z^756JfAR8}m;dteAMX+tQ2z+!XjOl+vZDXc>7Ogz`r7GexIZ{J9}Soc(@;85S@k7| ziZo7l1%tF`or^+{j;OtiCjGtZ?#wPwHplgn!fD;cyOGeuyz;@=#G0I z)sJ7OSNQ6?iUTdVC!a>;4RVKNgh1?kufL_bZaPLOle~~JUld{N3)sbB<;xV+6!pp% zcC9iF^DF`i?W%OlHoX^6v$>Q~#1nckn3lN_6J&Sd$`e6|4wB!n3Rc&78B3C>BB~?_ zR8|pJiy||d;*@*L^Y6O`g)m#S^wGO!n)H(lRj>+*D{z1hw6&Hb+&}$5+tQ%Yl9a_a zwKE<>afzpmt}umK)Y6rHKJPbW92pN=6D%3@F5BJMmvB)OaaMsr6yGZKjO0O7vJltJ zz;Hptmq8R2F?#Qm<2;|n0o*5vd$`Pj4ZxvVOeSE!%2Oj44F;uOI^ng=(>8}?RV)zF$wc&gZihOyO{Kn_j88&8AmONr<#%P+}H z%&kpGCQFlCjjN3gKfgaR1Ek9KQ0?VlD9a4NMP_|%3~?d#o?#1JYv@}}P@delYa4w*^oEN>HF!7}LBkz%aWICujcP_#;}l zQ)dI}V9Rp0sN}n6-^m!0y5t#3B&PE!7gndZDDpyM)nK*>d^^ur4YkT^i!ehJ*qfm} zye_q-hutOtsT8XF2lPlCd(0>%lOj)nUMg^aaUWy+G)Mi#H`4r0f{{xnV{RnumPaL zN`R8~BZ3q3lGsM+5b;w~^yF;#kQxBDHZVa6*td0k0i^~DhnuF(0HAQ>Dj?WY>7rhq#1+P_lim_W}Eg&C$L7k{>N92}c2 z@02sxv{&w$gyXt5M)3rFLT}^ShmiRRt`6$PiHZoUa6UNPf9Eq{I0guK1SrELkz<7h zGpIK!l7OcW*D&iQ(Bi1g;8BR6f4f1D641L<%PiH9w>)lh(?~{mZ3i>e$50Y3m<=|0 z9MHfu%RHksC9j2yZ&f@uDK_t$6nmKWG)&A zyGrXYi<50QhO1{}0+q0_j*a$;I`vwu{b`TQ-Rq;%I8EvfVpF~o`sSFS^@MoV{^GW; z)Dwetqeld7sR~Y3Rn3~ox`!Y-(JPo>-03mfJZv3ORYZf@GVq+2oxFr(;U8r@U zMs+-D#z2l!Svg z?WY}vyQNvlaQK^pAvbM74Kbr+~wY62h%zl{D(H9*a%DZ9^ses;O z7tcQqMqIU->cpEanBk7IGpMc5i9nnsIL)Q6fN!R^Z-k%?L&?@YU+7Y zIqHpvYg>nUdc3FTE;orCqiX(uDwNb-g?6Ct5EY_kV#Vt{II;c>gzU5_A^DF}ZoO!e zTHIO=HYIC8_k?b_s;@@?0KpAZrYK*SbGajek>-TurfP#<#;$H*KbUUi>09t5L-|P} zbS6(*n$C8%HEj@g&CmpQC6JC>=i$$>OAI%AZgjzOPkT-n-hW|$3JOd)S3#25{^{Q3 h7<_O4@KW7$esXqnEQfojpSU*`;JUfK_NV{n^FOY?c$xqJ literal 0 HcmV?d00001 diff --git a/v2.0/bin/FIND.EXE b/v2.0/bin/FIND.EXE new file mode 100644 index 0000000000000000000000000000000000000000..b5d07d00e2f2478ba6ddef97e1d6a93dd801ab52 GIT binary patch literal 5796 zcmeH`@oO7p7{{OYuFH~(m(_8WR&jY#OPtPbH7N?+wHhrO(KWUSYrDp(u}x>7%a!Zh zu;N@~Ke_v52#Vq_ZWF~(C9q?x7i`8(0$mBiiLhElu^?|a_Jj6^3fny2OIm-~KOl1N z56AmH&+~qt=lMME4UByT_W=Ng`@yzfM1cDHAFrPQ#{G2TuKzWGf!N{cX(_XBAU7dP zv(l8ZZ}`c`Q$09+PuF@^H6$`80)e0bg6^w^JkcwI%Yp5S?*fT1{#B*fXchLJ4u}F- zWQt7fK}LVN2-Q$>Uc^dTCK|Jz2v@ej@Gg2;XDNkCtlsN1ILp>{qCw+BC)s%+a*Lco)ThxPGKUI% z?O-du%?@&CRJ&jfZS^RXCEL-d+n}yGOK@BDeP1pI@sl4~=No_f)l&czo?q z?e1bXJ5Q|-@4qIujSOkm*1YSVD@{jUwSFHRE%b%JR()2fvC$i4cx+D?tS^#1>Y* z}vz@Xm_*rfRoq|H?F?C!d+1uEOdV=8OsYAd4`e!HVBn_HvWxuxm@b5|fp7zmn?TP3EUB4%Wd_|{3L;}`RuAHy}c z1Y80x0hfSFz$M@ka0$2sTmmiumw-#aCEybHPZNmeCnQ--+ | If variable HARDFLAG + | | is set then the loop ++----------+ | is only performed +| | | once. +| WRTFAT | | ++----------+ | + | | + +------+ | + | DONE | | + +------+ | + +---->--------------------------+ + + The INIT, DISKFORMAT, and BADSECTOR routines are free +to use any MS-DOS system calls, except for calls that cause +disk accesses on the disk being formatted. DONE may use +ANY calls, since by the time it is called the new disk has +been formatted. + +The following data must be declared PUBLIC in a module +provided by the OEM: + + SWITCHLIST - A string of bytes. The first byte is count + N, followed by N characters which are the switches to + be accepted by the command line scanner. Alphabetic + characters must be in upper case (the numeric + characters 0-9 are allowed). The last three switches, + normally "O", "V" and "S", have pre-defined meanings. + + The "S" switch is the switch which causes the + system files IO.SYS, MSDOS.SYS, and COMMAND.COM to be + transfered to the disk after it is formatted thus + making a "S"ystem disk. The switch can be some letter + other than "S", but the last switch in the list is + assumed to have the meaning "transfer system", + regardles of what the particular letter is. + + The second to the last switch, "V", causes FORMAT + to prompt the user for a volume label after the disk + is formatted. Again, as with "S", the particular + letter is not important but rather the position in the + list. + + The third to the last switch, "O", causes FORMAT to + produce an IBM Personal Computer DOS version 1.X + compatible disk. Normally FORMAT causes a 0 byte to + be placed in the first byte of each directory entry + instead of the 0E5 Hex free entry designator. This + results in a very marked directory search performance + increase due to an optimization in the DOS. Disks + made this way cause trouble on IBM PC DOS 1.X + versions, however, which did not have this + optimization. The 0 byte fools IBM 1.X versions into + thinking these entries are allocated instead of free, + NOTE that IBM Personnal Computer DOS version 2.00 and + MS-DOS version 1.25 will have no trouble with these + disks, since they have the same optimization. The "O" + switch causes FORMAT to re-do the directory with a 0E5 + Hex byte at the start of each entry so that the disk + may be used with 1.X versions of IBM PC DOS, as well + as MS-DOS 1.25/2.00 and IBM PC DOS 2.00. This switch + should only be given when needed because it takes a + fair amount of time for FORMAT to perform the + conversion, and it noticably decreases 1.25 and 2.00 + performance on disks with few directory entries. + + Up to 16 switches are permitted. Normally a "C" + switch is specified for "Clear". This switch should + cause the formatting operation to be bypassed (within + DISKFORMAT or BADSECTOR). This is provided as a + time-saving convenience to the user, who may wish + to "start fresh" on a previosly formatted and used + disk. + + HARDFLAG - BYTE location which specifies whether the + OEM routine is formatting a fixed disk or a a drive + with removable media. A zero indicates removable + media, any other value indicates a fixed disk. The + status of this byte only effect the messages printed + by the main format module. This value should be + set or reset by the OEM supplied INIT routine. + + FATID - BYTE location containing the value to be used + in the first byte of the FAT. Must be in the range + F8 hex to FF hex. + + STARTSECTOR - WORD location containing the sector number + of the first sector of the data area. + + FATSPACE - WORD location containing the address of the + start of the FAT area. A FAT built in this area + will be written to disk using the OEM supplied WRTFAT + subroutine. 6k is sufficient to store any FAT. This + area must not overlap the FREESPACE area. + + FREESPACE - WORD location which contains the address + of the start of free memory space. This is where + the system will be loaded, by the Microsoft module, + for transferring to the newly formatted disk. Memory + should be available from this address to the end + of memory, so it is typically the address of the + end of the OEM module. + +The following routines must be declared PUBLIC in the +OEM-supplied module: + + INIT - An initialization routine. This routine is called + once at the start of the FORMAT run after the switches + have been processed. This routine should perform + any functions that only need to be done once per + FORMAT run. An example of what this routine might + do is read the boot sector into a buffer so that + it can be transferred to the new disks by DISKFORMAT. + If this routine returns with the CARRY flag set it + indicates an error, and FORMAT will print "Format + failure" and quit. This feature can be used to detect + conflicting switches (like specifying both single + and double density) and cause FORMAT to quit without + doing anything. + + DISKFORMAT - Formats the disk according to the options + indicated by the switches and the value of FATID + must be defined when it returns (although INIT may + have already done it). This routine is called once + for EACH disk to be formatted. If neccessary it + must transfer the Bootstrap loader. If any error + conditions are detected, set the CARRY flag and return + to FORMAT. FORMAT will report a 'Format failure' + and prompt for another disk. (If you only require + a clear directory and FAT then simply setting the + appropriate FATID, if not done by INIT, will be all + that DISKFORMAT must do.) + + BADSECTOR - Reports the sector number of any bad sectors + that may have been found during the formatting of + the disk. This routine is called at least once for + EACH disk to be formatted, and is called repeatedly + until AX is zero or the carry flag is set. The carry + flag is used just as in DISKFORMAT to indicate an + error, and FORMAT handles it in the same way. The + first sector in the data area must be in STARTSECTOR + for the returns from this routine to be interpreted + correctly. If there are bad sectors, BADSECTOR must + return a sector number in in register BX, the number + of consecutive bad sectors in register AX, and carry + clear. FORMAT will then process the bad sectors + and call BADSECTOR again. When BADSECTOR returns + with AX = 0 this means there are no more bad sectors; + FORMAT clears the directory and goes on to DONE, + so for this last return BX need not contain anything + meaningful. + + FORMAT processes bad sectors by determining their + corresponding allocation unit and marking that unit + with an FF7 hex in the File Allocation Table. CHKDSK + understands the FF7 mark as a flag for bad sectors + and accordingly reports the number of bytes marked + in this way. + + NOTE: Actual formatting of the disk can be done in + BADSECTOR instead of DISKFORMAT on a "report as you + go" basis. Formatting goes until a group of bad + sectors is encountered, BADSECTOR then reports them + by returning with AX and BX set. FORMAT will then + call BADSECTOR again and formatting can continue. + + WRTFAT - This routine is called after the disk is + formatted and bad sectors have been reported. Its + purpose is to write all copies of the FAT from the + area of memory referenced by FATSPACE to the drive + just formatted. It may be possible to use INT 26H + to perform the write, or a direct BIOS call. Whether + this is possible depends on whether the FAT ID byte + is used by the BIOS to determine the media in the + drive. If it is, these methods will probably fail + because there is no FAT ID byte on the disk yet (in + this case WRTFATs primary job is to get the FAT ID + byte out on the disk and thus solve the chicken and + egg problem). + + DONE - This routine is called after the formatting is + complete, the disk directory has been initialized, + and the system has been transferred. It is called + once for EACH disk to be formatted. This gives the + chance for any finishing-up operations, if needed. + If the OEM desires certain extra files to be put + on the diskette by default, or according to a switch, + this could be done in DONE. Again, as in BADSECTOR + and DISKFORMAT, carry flag set on return means an + error has occurred: 'Format failure' will be printed + and FORMAT will prompt for another disk. + + +The following data is declared PUBLIC in Microsoft's FORMAT +module: + + SWITCHMAP - A word with a bit vector indicating what + switches have been included in the command line. The + correspondence of the bits to the switches is + determined by SWITCHLIST. The right-most + (highest-addressed) switch in SWITCHLIST (which must + be the system transfer switch, normally "S") + corresponds to bit 0, the second from the right, + normally "V" to bit 1, etc. For example, if + SWITCHLIST is the string "7,'AGI2OVS'", and the user + specifies "/G/S" on the command line, then bit 6 will + be 0 (A not specified), bit 5 will be 1 (G specified), + bits 4,3,2 and 1 will be 0 (neither I,2,O or V + specified), and bit 0 will be 1 (S specified). + + Bits 0,1 and 2 are the only switches used in + Microsoft's FORMAT module. These switches are used 1) + after INIT has been called, to determine if it is + necessary to load the system; 2) after the last + BADSECTOR call, to determine if the system is to be + written, E5 directory conversion is to be done, and/or + a volume label is to be asked for. INIT may force + these bits set or reset if desired (for example, some + drives may never be used as system disk, such as hard + disks). After INIT, the "S" bit may be turned off + (but not on, since the system was never read) if + something happens that means the system should not be + transferred. + + After INIT, a second copy of SWITCHMAP is made + internally which is used to restore SWITCHMAP for + each disk to be formatted. FORMAT itself will turn + off the system bit if bad sectors are reported in + the system area; DISKFORMAT and BADSECTOR are also + allowed to change the map. However, these changes + affect only the current disk being formatted, since + SWITCHMAP is restored after each disk. (Changes + made to SWITCHMAP by INIT do affect ALL disks.) + + DRIVE - A byte containing the drive specified in the + command line. 0=A, 1=B, etc. + +Once the OEM-supplied module has been prepared, it must linked +with Microsoft's FORMAT.OBJ module and the FORMES.OBJ module. +If the OEM-supplied module is called OEMFOR.OBJ, then the +following linker command will do: + + LINK FORMAT FORMES OEMFOR; + +This command will produce a file called FORMAT.EXE. FORMAT +has been designed to run under MS-DOS as a simple binary +.COM file. This conversion is performed by LOCATE (EXE2BIN) +with the command + + LOCATE FORMAT.EXE FORMAT.COM + +which will produce the file FORMAT.COM. + +;***************************************** +; +; A Sample OEM module +; +;***************************************** + +CODE SEGMENT BYTE PUBLIC 'CODE' +; This segment must be +; named CODE, it must be +; PUBLIC, and it's +; classname must be 'CODE' + + + ASSUME CS:CODE,DS:CODE,ES:CODE + +; Must declare data and routines PUBLIC + +PUBLIC FATID,STARTSECTOR,SWITCHLIST,FREESPACE +PUBLIC INIT,DISKFORMAT,BADSECTOR,DONE,WRTFAT +PUBLIC FATSPACE,HARDFLAG + +; This data defined in Microsoft-supplied module + + EXTRN SWITCHMAP:WORD,DRIVE:BYTE + +INIT: + +; Read the boot sector into memory + CALL READBOOT + ... +; Set FATID to double sided if "D" switch specified + TEST SWITCHMAP,10H + JNZ SETDBLSIDE + ... + RET + +DISKFORMAT: + ... + +; Use the bit map in SWITCHMAP to determine +; what switches are set + + TEST SWITCHMAP,8 ;Is there a "/C"? + JNZ CLEAR ; Yes -- clear operation + ; requested jump around the + ; format code + < format the disk > +CLEAR: + ... +; Transfer the boot from memory to the new disk + CALL TRANSBOOT + ... + RET + +; Error return - set carry + +ERRET: + STC + RET + +BADSECTOR: + ... + RET + + +WRTFAT: + ... + +WRTFATLOOP: + < Set up call to write out a fat to disk> + ... + MOV BX,[FATSPACE] + + < Write out one fat to disk> + JC ERRET + ... + < Decrement fat counter > + JNZ WRTFATLOOP + CLC ;Good return + RET + + +DONE: + ... + RET + +; Default Single sided +FATID DB 0FEH + +HARDFLAG DB 0 + +STARTSECTOR DW 9 + +SWITCHLIST DB 5,"DCOVS" ; "OVS" must be the last + ; switches in the list + +FATSPACE DW FATBUF + +FREESPACE DW ENDBOOT + +BOOT DB BOOTSIZE DUP(?) ; Buffer for the + ; boot sector + +FATBUF DB 6 * 1024 DUP(?) ; Fat buffer +ENDBOOT LABEL BYTE + +CODE ENDS + END + \ No newline at end of file diff --git a/v2.0/bin/FORMAT.OBJ b/v2.0/bin/FORMAT.OBJ new file mode 100644 index 0000000000000000000000000000000000000000..61fe10703152887135ff8744f09b50333114d8d1 GIT binary patch literal 4864 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 literal 0 HcmV?d00001 diff --git a/v2.0/bin/FORMES.OBJ b/v2.0/bin/FORMES.OBJ new file mode 100644 index 0000000000000000000000000000000000000000..247f39e84b67a976b1a31bc3e287b3aa8367340f GIT binary patch literal 1152 zcmcIi!D zQjlsFT@?`*F3rlVxDr$l!Id8%ZbXoNfZ)PA^U`UTZk*Med(S=hoIA5~2D0UvRn?vG z;WWV1YRxDa&!(a4X_`j%_GhtVZImHXw<@Ls;pKnvw6Fn{^r=1|AZs-j;eYlj*G2f*^ zhF*_T=8tHPkLY%n`!wXt9Tn;!7b0!QfVTLi=f@HQCZ*?Zq6RJ4BO&>K%8>b@!_kL} ztIG)oX9L;gA)RYpH|LiNiKij!doFEvS;*QFy;77M2K{KjX`i)t{}f3X68E21U#(MvnaALE=ynYn&d=7UTu|(vH$djzqR|gX+Vyun~2aWgW z4ccNZy{1-1ek5Xc;$1`?bn9_n(g7a?;V3!!MC15O$fT{2%<{=qEvr{n*&YOj3+c&rMB z?&vsiNrT&J!m#fk{z~ATB9yHv8n7A!zAM7IWf)fD5a3UWQBeY1QMh6@R@bdh0H0Hg z{3C$F6xVg@EP+RA!G^w4#~n)=%pA<1$4s?UE!`gzxTW}J&9R%dM?h0;vv$`mJteTN z+P1ld@)p3&6r-I*faU}@ZR{@+D5ephGy2q& zwN5AzXmJ|Ch@unGL7f8Lq!N@t(_kyr=E`-2<&Q^!skJru~+F+3fkDH0E|qtB3t&kbhgDK;PJkHoNQ9AFWJc9W_J{ z@<{r%&7buEzlN-jO!DM2xzop3*U;$WX1SIFoWrWy`wg4Pvz?0~)DJ60aM6ikt6U~2 zTKQ4ZZAHc=&|#oFBBKid5B<=i&d|ss(nAsJ+9{y*?$?i-9eVIJx0z;dzd^KsPm2a= zP2;%)o&kTNs7X`I*hE^7Y*4gRPiVa&?&kW#D&Qq(7n|PBK$xzkoB|vm90zWl?J$>k z2z$KXFBW56*@(_7>m3Ga!unH`KT_^tx3ddy2rAWJ9Ai`Gnmq;Ac@7PODy!KLO#JqK zPxGrAsYLGI-N0^D;2-IB=6F|FRXG$cBFJ1+g5w&xsqgz7@SV?HtzxzX@1QT_4DX*c z?F~gLGU9Cv60eNDR?JXPKj2G+HG+Sb15-kh&LDiiUE~l2+MZI`6h6OjjZMKU;JM%E zr?eH$|J-2fC4gdy^}MBMnxj+Pnt%E2w;h%(bz+vPuG!;OapO5k)zaz?l#Oz9)eiK^ zv`Q}GQvq{md+{=k^bfLO*owj&II?RZi~i?TJ2zmgm@QrbVRQmbld>T>%*o$_vmiRo z(;T&7gRgnCVTtt}zAMtcb|WP`%v3dH#G7V)_kPNFxZq`;)S6P#Bsx`SD+x{jGmuDf z>^*ppxs6BiavOMg-Hwnmu)P$A?G57BL5`ZI4_9>T7h?N&fi(we{dVVZLcv_+Yiu%D z$EA6e04keYO$Q+tqP50S;C3Z-6vCj3^5T4!g~L8he4P9l9pB8Z{_1)02Z*_J(#58! z{A*m&;@)*IT68O^-vTMe2(a4J5U$$_l~GM6${32T{5OE=b|i z$~)i%jQ|{|a!$oJ3;6{gA`ZWP3fSGKB%!Ypz~dKQ1tX)Zq6Oyozr^{1j05SdT|v{cqPlN-f=J literal 0 HcmV?d00001 diff --git a/v2.0/bin/INT24.DOC b/v2.0/bin/INT24.DOC new file mode 100644 index 0000000000000000000000000000000000000000..d38d6fa8310a1154aa6217b74f629841ebde851d GIT binary patch literal 4224 zcmcgvTW{h<6z+4R{Dx{sr2OxKrJrziZ=y*#I0nkuVwAu<~1 zqO?Y+!j|v(ac%rVkxD}wBcGJ6N_vu}gg{Bk(pHpIXiFr&Y%-N7o9&27E38btyj=@R zq9Et6^O)A6NHZv;yeciLEv0#qWY>}af{`m#T4^r5{MeFW6I(p^y;4S|I0%)`^_8^O z1x1kGNAPJa3w9T(D3zsCLsk>1RiTX}=btpUOSya5-PW> zp7pbVTEEq`yfr(gRBxmaj5VFbaVLK0L~*D8xik3Oi9VmV{6*9?vPmX|0jeHUQZU3w z(MFUO&MqppieH@f_N=L7CxE02myaC)&506`WhHely4Uzva3HxzB`tOwJ_zOInN=Z0 zmqhpCQ57p3KwdQrBW+#{ZB>>zG_BEih-Y4&83t#QM@AI@*)=!=7x70dRHiH+2J}WU zF51*N5QUd_X=tNSbKMgMipsUFG6p}}iXFZ~S7jI(=ymA839k)ci(m_A`E=t0%!-9J z77>nw$|`UGvOx_#wW4v6A`OA093avF%qrB2SY*;Chw$AhU;=}M4$(NYmsOFtyfbvn z5ystxc-^kRr4$H6w##p@7Dgl}2~g`vCCI&li1B3Va&3f!rJPHSzm?2fCdj8Ma|BBd zp^BLoo*j`Yk*e|c)4krUG$EOu2u`mDmivw?<2^+VI*2Nk+T@Po9{y0fAZy8$>wtBo zd%!ZJg;U3*?mr+XCQUr{^84aD+pblzrb0pwcO0;{sls;g^dH{GV^``(MD%Hj21y%@ zuEyluGsI(gE0GFAdg<-47Xjr&R3%fNZ+T7vrG0#^gj_RNX=`Oj_tNMb65MCjUbAZu zY!yucs@MgNG#J4_L5oZ$kAbd+kgQg^I}Q=GYzx-$HK)CNQ0q(-Xkke5(iv=m0&%la zv*UVU(d%UjTFjf`9ex}Sh8NLn{BbyoDb-1p%fb@U%3}k?uM3t!d?AdbD%|`C{`*P32X148cn?bnTLqVwEUTqEAd-q2t+ z@ThpHH`GUvUf~SWSYmv~7&i&`EXriDvTLYm6#PK3l#hoR-Zpk~nJSd$!PSVpgIHq0 z2rl!bt_rLY-hm&1g|B0cu?N^U0wdMyXvBK~wvnhZ>*e}1L+t4ExN~69eQe|g^ouMo zptE`+u+<)VHTaL2jkbe{0m}OJ;u=a>ceGGlp7m~ba;GkS_V$C#R~O%Oy=n=44K3^; zbTG7%LVmFgYlH5uM?!RV(IqsE3~NF-dwv``wT1qsd#=IutThU|h(yJ`bhRyg^_ALv zLqDOO;3Zdd9nlrvSY((<&xH5^s17+)cK0PaF9`85?h9A7u|Z`F_q5Wg+U7G$wNUrD zkS36C1OEM~(Dkv<NNVZ(?(-iINv(zq+{T zj-j3;7&8bS8vw7^-gDmM_gI~t1h96x3h$ScY0a-92r0Afro*ofH#46fm6Ulvr(7?Tm}>XtAKK#3V0CM0Xz=;9C!x!J@66mPhf&% z6s`r902_hrz>~mUU_bB*FioftHUTdKxnhkl0hk0_1$-T-1-=dZ3Wx%oz^lL!V7{S7 zI0$?OTx>)>pdFA*_zm0w+zHeI0U!vR1}-$?U7!?L3#^1iSk_&Tr!_&)GB@OxlC@EY(};3ME9a2m)E?-a9u ziNIyRd|(5x6$k>mfu90T11Eq!V1nUJaSCuHP!2o+90iQVJH@F$32-am0s=rY@Fegw z@GS5W@D5-xAwMt^SPs+y0bmF45YPtv9@r0<%y)|8fXTpBz)YYBSO_c!Rs(kf6~GUH zHsD3zA3z*90~jUr6_^Oj0%YJ;;9J0Vfgb^Fz#iatz{|iJz+Zq8;U#ey@B`op;C*0@ z_>%Zl;65M(><9h<{0lfH92Y+Y#)!woI$$^O2Ot4_&v0D)Iq*B+PrwDn`i&$Da}4(bO~B8AOT{^c+kp+h1He9D5U?BO7>a;z0^b83 z1KNRK0j~n{jdKk50s-L1K-@IPaG80IVS=#R;0E3XGQ{165bz4H$gtZm+qm1X61dc~ z+i(*g18)MK0G|T)n0Fh#1q6XSq1SLBFc~NSihu=x7kEt=GGvNFh8uwwfjICvu*ooF zxWG7Mm1axz(0Un4W&jm@F4Iw@N;0Y zu*J9@*a18WJO{*p_kn)_XXv-M#rQf92l@cXu*G;8Pz`(=coldXNB}nD7UPA$?Z9^6 zVc;=fFK_@j1`Gl@rY*)I-~!uj#;br5U=0uk z9tWNPeha(=D8Nj~Yz#iZb@FOF> z1J4340)GMC15Q;9U+G(&jWbQf?x@MGXA!_%fUKmd3SxZ3zMM(b(Q z1E!}^Je2S=2{>Gv;aQ^ehG8}F99C_C+N578S^o~ zY<|Z4TfiedWBxAi24Ko~#+(ma0W1aPSe`N83;Y5&257)8>oew7U=MH@_$P3=?HO|e z@MGX<;6>mftd73|#u>__DZmb(1Nb{&F_uZQfvvz#fPVnfO=S{Pp8xOuTT;2cqN=uH zgJWsAr@~!XzR7Ww!{x5N$6daeK5Hu6p8Fit8y!n4*So80t2cTaH&?Bne%=25*IzaW z!flbBKu=CXiO;GDwU&kw4?f-5Q9*D;TLf40e_(-ama*yw1K9|YhvsTd zK94+xJll+dSJI?)RwYlHx!Q^>%^K7ldcRe+QkIa@7|C~Aj~wgT?wBhG^gXsc=XOEK z=gE<0RW-8E6vETcXXrMi29crFZJpchw$5g=Vk&ywuJ^ioqLw16B~Wh?ysIK*QaA%6 zArCGHl}WCZEul=4(WT8?Vr|ZYKx?hCVi61B|A+i@1W&FuGn7dWwHuqqV2y~#(ln{c zisu-AQCeb!MyT9OCHoejF+n`PBH= zHOx<~G@*1yzzVXYm70|2P`f#I#oU`@$;V$oedxeJ6N!N3%l#$6%ogvIm=w$uw3$`b zXzmKvx$UQBDVKK1iQE-Dr!PVL6dzF0xJXWwwc$YSilPJVPr~`3%;yCEuH4mz6qRzA z0N9!?B1j^5(h|b*=X-@BFs_@okG`I=B#8?b}H)YXN6_T0pU$vKQ6iIffcw;2Ra2AkZrQobwfG!suwhF0ln zHlP$%Ci@eXd)oq;UDDlFK}hnnAK&h_n%sIa%hx2UuBZWp5MwvViQykfnS}W($_b25 z^JHY{aJZV+peB8SYtN0pwZr6U&Z9?#{E_BMB$J{W^zLbBNVjj8^JqG^d#vEl_N~_T z8Y>$WHsjhJ$Yi3qz06AO7QDvpR|S8`1DQ3o#_ogcTbs|=9cAAh^=33*4ZTE}M0_B4 zjPdRv%Iin^MzEJ+qhF7B&GFYxD<1kD#1jb`l(Lb2HRH+SXOy+{eK(%`p59qPzjok> zaz>d;-&;Hx^wEY40yc`uH2U?BH>+i5=Iig&+T-sGDHl*u7#X%h+fptW7A=hS-b{Vf zInzBsV|)+hdW9Icp=YevC7;5?mQNMQlH1t5U)&=uKXNn_i1l$t@wbLb2f~df)I#aO%(_yPPODftpHlN$8Z&1(E#9lSP=5v! zDJ9w=*F$n&Wc9$b*Y}v-{6Jhih^elayW{~uNV1gX8%XlaFe?ovll=Qms)EOsY=qAo zy;o2!2|sp1#e98n>@v)#XqBMkw(O!oF-JXuVvKGj#s;@W{W>2uHJ(y=5`VKpn6-WE zGS9qOpn|8UFdx0U0rU?)K6V*jT$*LR0)y1ifL;hF+vGI!VmhwiOwT5hCZFoQLB-g< z%%oGGXJMDD(%4FiA!lOpAMiDS6*n+IBmG?=P>&_TN;1%6>~6qAbuLj!?kkcLbxZJ0 zZ^YMkLW*4a;S^iVhvd$^2v~>l@25`r#IdGNivmsc~X-HS$hZ1YVQ-uM_7(9YLU{! zw9>(%1GN`{h&ugB2Sc~KO_Z6xkF8k={+5C@iMqt0fr#uNQQYrS=Gc;|`!-wH*Cea7yw2LEZnJC-wfW^|vPRVnuGLuStn z(U*Ft|dQWcRbTF+e@!NHf?^7BkwAia z&Ujx&tnp;OsAP7WkAy2TAZPm_!} zu(A33P@rUsRrF$sdIl@t`O)|EW;ID;Gjd!VlB@X`RMM93W%j)eabfI!Na&L8hgQ(k znCNd`YmGi_+PS|;nkhhsHuAiI5ib+4rWZ9t;-fwOG2aL}2GXG_O$(k1! z{R&2cbQ!%!SdCLfQV~#tlP{fH1TBbI4V5<7ls^H&;Hh3Ucr6!Nqv`^H+I}=Hz zf!d*581Y$BkF?=OoI;dk7OL}H72bJ9z49=16Fq9Gf&4g4dPG;#??p{lLa1F=QkmC; zcdF`@J2kXaqfDgReAz3=NTY<(==E9X9@RDY@9RPqyg+pgp)MLo_21QnjL1ZF(H00* z&C2jx5zgh^`r-ys#*8bGRhdD03uA<-S6}u9xa3M?p?aF06}3pcrRm#Zc<1S1 z;xd*CX7F`@bE`@0qPBrwvS@P_L63?K*M2SZT9Zp$feq8N1Fq(u!JHiefdd#+&6}%d zord=)6+dZrh*r@!M=;JzHH_d<5F1h>vdyKPCfl8AWftWjs^7wFD>3Q&nHrmsUD759 z3-&c8?bH)v()Uu|cBj70vhr5~JyIn9h3qCLY#fCyYQ5f6Xg>9-=Gj6|!x<{L=O$V8 zRPvvopq%KEHlVg(hKA)AW_r0!TP*S=zl+4dgix+@j&|q ztFnve9;lZDPj+-rbVW%VlNsr2FgG#DBsFEw4nL}G@zEewkK=a2bVmHSKb+Tdfq3Ei;rXqz3lS3&d?9*+M!IXEQcguH}@$f>UU1lC^wS z^ZPghX`heH++0 z>clpsbTD7qDGywX{m#W}$oL>zu8_*CSHS-86rW0IHC*%GssW`Wi+G8OVBK3jVv`KM zq{cID>9LR*L7VBZ>ej>4NwXsD0Kw0*1(VN8G-RqC87HtiW_#^$*=g*Ln2BJZEu4wn z)z10?i87|RY zWo^NR6{ZoCNX!0LX@A`2UB#^_?RQ!mN~)}a!FNq-F)TNOT~aZoU33D5(U0RyX8QRV zY&(JaLBVq|h|*qc?UDzfK>aO(7n{D5yW-){feyCUBvLbK@IsiqZh6b~R@9oM%`CAt z{}c=W?Taj7vZ2T)m*d#%APh;PN{kz3v|DT6SEM89+j!WV<}I{ii;ey z{~$Y6=uk?rVdHXD$K`zQNiX;YNnVky7&)PErm`kCs5)seh2oE@G^0OK^%=cU;@?uqIvK4!8$XHr1cvm=iOq9=Q!L~FopfQ;j zls}9(VUs+`XosCHr``BSM*CvDkW>-M`?T3u!5O%9hP6mO<;@DqAJW9YHvB@7r+Ms1 z<6K#olM2AAxaph1I_;qtKfXc1i{F6m#>d zLaP*%KVp;YV||i6snduTt(y@TmBR8zh0+aHzK8|tKjz{ciPMAmQo2f7d|Usaq2Zhf2Y?=ZEun$73XtP-wGT-f&2U= zlZvywe`W26$RA_AcN<_2IEk_GOxk08^Jqwp7G;=!TIQAA_#Yr|^*I?b1 zPqojm>U6EWkh17ge~=2XfJOO!Hw#+8Da~_U%e7V}n;-^;vl3^}3e7DjP+@5M=D9H} zOX$u7-n=voKl--btF)a0_IKbUHp6w@KhTq<6aQ^k*xCHg!ilwRoKa`1LY*UYXpazt znfA!B-wL5!IQiH$abf6C5SHM8tctbo1WF(xJX@*tPqAwU}@70c3);trYfaW*hi@;5xH{dk2c?{fi zV$ydr1=dpNPIKz8nN;a8V1g_NUE7=Smo@L0UZ7E+0uP(@0$X-u7MHs-i?`NgnC2Cf zx9!M8O2ItT1|~s2bV}!^G>51CRbvmtgrf2h5I%>I~jQ&thKUZ3-%@<5*$C12g8 zNWBfJdeh8<#^)tk>>@{wNuT}9GcfJQEwGRV1~qS1^sruL_pcxoZ5`&}Qyy7ud5AB+ zOOgWWdj7@i9Us_c(Qs7gw7~33Cvj4dZ1H?uHwKIl|A*Mo5CjD~8e%I(m(xaOMN7zu zX(xr8me!e&rHR&6*7lhYNOQrG=JvT(Wdd6o5+sXtd5Vl^Lda>NImVQ{F2zO~)^}uE zEc#z^Tzf!y3y)A!O8;5j>bIH&!{R9d6a*DNjIyanR(;?KwcT$;0=NQc_zoE!4-9Mr zO>(h*`E{C%_32o-8vsA0F(@-c|yr$4Q%2nWds0XXCL>mO} zD`*5;eau)7l`&L~M)Qoe7;K)UrpI#3>iAMpz|d&2gFawIi&({hlGT`LHF{C*b*z*~ znJt`QGOPQEHfvPm1#PI&?Co6-SVM~4D}M${y;re?rn@o2GZ5C!5Hl2IEAFc-Cm3YPA!H9!Pl2; z8K)U#I)#A<%Ad}XB^cAN;q#t{(S~Y`Gat>@7nVpvCXJ0YKha66^^0_#Ed z7L67-=xKMdxx++OLyv)`85tO~nGf32EDSJbL;$FXp83cT&i$=0?eNWHnlX?Ogd0Hk zaW|Ps7Ly@_UI=C|>ChzIC*-g)u@a0)-$7)7N*WpOzQC$62z6ZZ+NeHk;h8G0e;dHo zDVTwCXR_mfc>*sk5e3f_?YSk`S4i>gv<8o5q{r#ibdz!(@jfb&6Uu+GWN&74KJ3k; zNq~Xn0n`CA5$qvk%Ai6qR!5F?ZimfX?%g5xX=S~E5hu3Nz}a()V25R=7=M3_4;7RIvnlOex9659MjmoE>In3Vq2u z^=mI%GGEu1oQ58o$o3qN15zwQ=#;ZUjeY8l#sOG;Y&c+0B_!R2y@$_sj>--Bd*oPX z`&-%UO9Wp)F$}nOA}i9uiqw>^HK9aTbOt6#4E@AnY3_&d2C9s!c?#UWlBW-IPI_{9 z)@zbkVb2FolfaDJZidGDf$<=WqDMXsJ=mKaab|=b{E#gT%&fc|%V&0u7L)Sm&zKzO zYq>c>OKuMN102j|Hk(Pv!L}MZg%5sP)kk@+mUu%sv0gO@H3lDP8!gs-S5xDsIIXonDaPrP z%EUDqC#IFOE%Gd0Unn&#BzK5~jk3N_UW6f~KAYP2ED8IydXXw9kl13JKr(@T$6>QE3=) zprWdfR=GK3pkhqi{2aWHF^058439nrLSHLFG7Tab2VmmhL~hQ36SmHGwG#Bh_Wdw6 z<>WAN%XmD{V+)trlAK5K$%p;3jn=m*WVFQrw&ocJro)U3WkB`76bxl_XwY}qR?fn; zX$PbUtt^;5*u9gm49Xug!6zubS1=w9m3|CLV@Hp@K8}vD$@JHMAo$>%6c1-)IfC;0 zk+P4&xzK}xrAKKeYIt*hc=h|w3fCPZGl1NKpJhj%6RtbNj0z{-JWStCMC9Z6hAhX` z(hoE_u9beQ{0y&?N%X_eYRH=t&rcD^a0-PUrReDiyvGx<2EvODo(c&O=k?^c1g8ZN zQ_Mv2gm+1X8Ll^*>7gWAuo}kXV}if_*p%AxNLgRRH|U=wcyZ!1Mf1RZtSRewY8aM| zBS)KZjR&woVnihHI$ONQG4g;c@~OEH?4d)E3}w11AHxb@gi9U#?*^v09}iRwPEmdY zy5rCuqf#V)=!W9=;T5vleHV=$#Ie4Q>6CLwm}XHGrwp{=XO?(upwJjExgmHq;jie~ zh|$A{qQX*3XqoAE7?ImirY(f!`~1-DmeB1vq1$bt+q1&A=e_>d+Vh*vUxCHdln-+R z%?d1X*peua!HF&>yjt-Y*oM_Um#qmM0!k&3@f6hp1uKg+k4)}l1*ZKR)SJoFcc;k2 zAhZN2{)Um3a~rii4|QO}rzH)~fgZT9*#yrt{1vgTV!41lwn-i!BQhEG$cW533l|I2 zfqt?s=XRD2ObusrmPu2C8N_x;ZI4pAGO($x&tos-QKLjbxkK~ip;}k`*VGtJw}p{1 z?BAqm&K!Cxlu;z-km8+#uk4Az=*+>!1omoJt8G(56W2}+tuj#F2xSnRO?DiYSWBJeOBb#5J3Y?H!<^leg?DN z<1I7`$`VKxqSjK|ooG919d0{W_*GcOc-~wvBD1vsQM>lEf{0|0IgTa~nELnT-y1Xh519V9ZM~3S=Uy zb}QpN5AsEvS)}?cvxQ0%H^~$0yqiiTz8a7v-+e0+lr|%oFCk_I$)!OaMCQ6{ zl5gOE$5m8{ZF?;{!wN6U>pMdBJa;Z{^E4QYojK$&RA!4g^R$)mUkj<;RwK`pZS)9v zk{$iGy=0@?w^HZVm65VuvitHmje;a>QzG|EktL>S{|VXEbdzrT*Exx4<%}K|GkRRe z=z%`wbowwgOrQumx*$$e9KDzy3dJ=h1L6OFh~&IHFC1J7^>&SLo1in<8bWhA9XW z4U>wJE)^vv6|snt2N#n_H?V3k!?2wKWAyP>EWSzZtHZf2`GH~g9FY6O+K=$4%bA1Y z8YZ{6&fR<~nRtmyUEorFh{Don8dDN6F1KZTaWeM$Y-&R?2L?=alb#;;|qzp_v5 zbeh_$>^r0yd*~3PE^U$MbeEl9;*=JGp|mr<%I=y9Hw#D7oK1uY`BVkoRVqD&pk@tZ z->DEB9kW@5*UxE+6G*D6+>8$! zzG_U`@KMp^^onBAx9md8Hfq4dF=?9}uFQUW_eW46h8(rnFb`#WABjozc1@YzvXyd` z43j}}+udW(BkExWb+RM7`_}?JkIZ!2r^5ael!r9rDt6SGVB>$JJItP9B&HTRMfaNI zu^KBfmf@f3--b=9X{x$RB#xrwCMQh0(QkvjNFuO|sEDbg><89sbwAZjmY%7xxnlNI z+Sbvq;hZ0q5TwG06)YV>8~vvpwHE*BY)m^J&h&=jKPF`$Iaep6Iq{#WLHY0g`oGUb z9zo<3&W=7w2QT`*m0A|Br))9#T_G(0y|{o8H(dI6=-JcQ_qCHq=PnxlUjHuG3y0|Z z0ltI#=zC$#gZ5-D5ck5c{4O;)c*}dNnvF2g{auycRUSc;vOSrot<4Yq-e%YIoU!@u z2~DN%_q!(P9o!QS?Oz2)1)5U@U2Vop)$-o`8o{{hPM>vjj2E(;7a zU$CH{^WoBdPz75vavfk4;*>j!S}5}}jFcDaDs-nY@XQRv3}Lw+^#lbNC`dC~O0_6I zp&UNSL8^y;mcwgiPW&zP)UZi>UjW`9QACCeWFjL9GfMEo5E&=S%oP~=E%|)h64-BG z=2R*Sj%@+E;JF6QnrMMuLpF43{AvlAx+p_f2#Vy*2@m66V}V5qYDd%C z8thD&m-iIR%6R}I&YVR`8tfnjzA^%oJfQz_&B|%uS&)w1+a$RUy~zaKg&gHkaKBwQ^O8)AzXtcXEjV2#H$7_|f`hgof&<=d0i=qx-I%!#;xxH^ zofXIRZQsdk+n(9J(Ar*VZQp2Zi)6OfTj9swez&zt@>xYz6g=ne#m`MRKx+GbX505N z+jeKtDUsIpgUq(;tZmm@+c#L_i$$DIN4J3mm*QYOdcs6UGqfKkOF4`murRi}tZ*+S zf6$=Qs7dwK=t<;)F(NJ3mgMuc#!L+@*28gf;PO|1L6d6eudL>+iOHX74J9=N2*;|4 zZvS_T{_cACi(o$JX8za4#%C*bBzG{r&=;HScOfKXq;QjTbPLKLed} zXos-<;CZbz1#{cn1sdu>3QXM)th2SDIxvO1V6As2Y88}V0QKh9W=H!mg;rn44O`IG zn@Zdho)_4TO(mWSp4XVq!Y}#LD^ouOp?yn1`__WC`hs>}0j73=)*Kp+KU&@; z`9b{-$hS0_Qjrf>pBF^h)BF-sltPtS8}0CLkBd^!-Y~V%o-1@pjdrQC%!F+LHUPI9 zutthVLcTZSM&x2kWRcV0h8{pZ>rjxm_YGM&Y0f0iR$!bfdEPASJKx;2PvEA^vky+# zZ<0H-S796bKuOpRV$*1c*<#0(faduKpp4%=)choZ!jq8*He;8B%tF%QhG2&w7=i-! zX((}+){-j;LCvj zcLRxOUjDMW^K_yKPh8Pbb`DxX=ZDi=%=D`KlxoJLq2^~tuQ$7*4)8LWEXgc2GmMoz zXWe;-bt5Q;&E^87ps{eq+15Dbn(!N&d}9^(Z^ zxgmJkEe^dFegJNB`|vCvY8vv)3*phtq1XJs6H$-_j&$s`$g_!|QcAlTaU%G*)B7yQ zGK3Wb??TiBIVT5b_494O_{XLv9t2%4!bM* zUA=UD`@zF+p(1H8_zIr!;nkY|gKc{(Z+x(Vg+r||9Kh)(9>Y|Q{j!D zr?ciS55{ED03KB-OSA6K3h|J>j;+?CDQ(nZh-nh8EH=xx8LJi#9*%-S-`D%_iR%Qy>%|ml24+|59w_tU4o8vjd~G?#o0A(DNZ|gHOr)3 z;3134J%QLn9zT7Ox`+5_5%JT8FN>f4GgP-;7C*fu6?Dksr!nNitzxqArf}IQ)~8e; zHB)n4{`(Dl7skx(wampX6{gj zhhtDtxtJ$j;2n=5*h%YPm(wWF?za}lu24cx8oaP?&@&dJJsl}VFHCHd!o#$c2}m;~ z)ASH+*uM1g@Fncbq7j)TpY-M8`{aq?)hFNhz;+O=WkYl+ndZo@pD1z~p=iOsDEdQv z*!d&Hh_E$0$BA~h>{B)dJoX!XNrrs?Z$@^fhMC-Hz=edE#Id^X>! z&ygW)nl;aaPK)wA zQs-^H?5G2z*sYTSlbck)hMp|8b8gvcB_H=>oOnO;svNGf@pBd7hxqF~FNpIorZ1>$ zYC{=Om5JfUK1XaLZ_i3PIDu0dj*0G|%&fBrQ_ub{BqNs+STC4DI2^CuuW}KFcyzRl zJI?SJ0yx_+R#(RH9EfNK1(G>9^;d?`;$)OLT7~i{_&oAhLWNU=e&3yZ;IYj8pG5KhM~Yx6a;U2ElT>YnD-Kt=Ff3# zr(B3K8@%?G-Q3U2#%V_H>kG|t@VOpnU1MdfJ3GMIXQtTY8sB~NL7~!jomMu}cfaR6 z`bb4g-$B0~K#VhstiFYQQT+5x38jR-Q^fQGs&XxTPsLJCreEL1lTQ*nMp}=h4tu^d zMq2B>ePoQZALf1U`Peq41=!OrAHMU-C3q-$uVD|jCZq4^;p0zG_%Zg`u$Bg4EreV? zL^B8`=TL@n170(DVVXdh?)2Aia{}BQg6y2qF;_W)w_(V_OLQpowS)RerbQp-Gw^L< zx=lVr#~#xgivJj5*TUOdNNYv7=k`Z4;Vh*%kPT1clX2iVSZt`vV-r%-1p{S7F&3yu z=c5?Ch+nfJ65;KSWGd&Kl|MoGalyrDfBhh?vB6&xtr@53$_ws4LcTSS);PPM6H5Gz zKZ`@#)3B3+HY|~R?c%MhW>c}?&0@lW69gKZ-`M@3&?J9O zn|nHG15{W11FS}$W3!3tL~xIaeg^_BKERD5WqqIvy9A+^V#?Wgyb{@ksPIG6=x^yj z!)YN8XAJBx(-r>+4jTj5M<1ml6&$_FgUogX>7UAS5LwhOdhiR;U-F$y!Mgya1Q=AX zKEa?8ZPrCdIR87~43h7|Hy1?r>JPP<3$4lcP9|oOvj{;o5`6O55Dsy({rR&>hw7%& zGJ<_Om+=@%W#ZW>$u}`zcvGT*1BJ-&e_j|VV$BKdb(VKtk> z&h*0we+MVg@>^$#&N(j%skiGgw@X@n5S@3_8-K%ECL0w6FdL~QXYQ6OvqC#z49&*LysdE z&)Aa9HB_?4^5#)?65bohSz;xRf&ttdg0qw+`8c|u=!|;O1(6jlQ)r?RbN&~y;n(?{2#G<$Pm8LukjsAupP zyI&EyYeav2kKkDxF8e2uFf8{Fv!}EAiO^xr*{6&&TL&BJPY8Ln*#0DHaSh5qyc>rj zIOE4G??LN0tJJbWv-$NTtW+g)_{TrbsRC{ddL6uUi;*m=1H6JD=BY*W=E27f$rRRp zIM8jNn6T9En{kNAWC^UNeZ~wUxn+Q87V6S;?dO+3d+eh_7u&6QI#^3g#3`Zt8}Umv#}I*mkjv;{*&D$qg)5kyHJ`4}@P zlE2m(5?b%aRXq1w5ekM4(}&P}=IWY{9-WZP4j0aIvL}#z-pK5M9`fo&>Exi6@;QNL zMZ^1=NS-7rdn}#xSV}%l_)8GZ4GI1c)-{zyTl0w!r;PvwUvokI3FZ|7(Z()=6Y?vC z`1B#DvU@ykeu>jW8M`c8_Q`VsJ%Gp95bU<`LirP~9c4zGIG)8$!2|{MLqU0oy^)kK z7*o84Urg-xvWo=Bf2WrMOArmzM|_JyjBrtxPr*|M2gg%#v7E9zc#>dG;MmiXeA081 zeA0VAxVK0?QTJW`>D`2)isW7e4mjjkM(c<#0XH#hYT+j~%W19y596XJb5QQ~*LMrP z0{F9XPa_5X3A(4z@xlXjzY5Drp?usufuAX;rQOPF{8coj&}r^I9|wvg4f#1DoEF%I zM8kqUAzY@h&N9s-OLUr2`Y^qqdsnUQ5Xd)Hie!2(XVP#$_fs1Oe|VCH%nf%w7@t&K zx-v!ikhUxN5q%}YMJ%bEN+N)WSU4M@ZP)=y&h#SqQKvn)siK_DFXv-a1m-Ka<$eh*U zx_rI4-aHM@lO^z%KllEbue|xxb$CCg=aByuE<4GqiAhi3B=-qByC`Q0*E^qwnVGnK z*9A9+c1>`G^PjLI^R6*26`8$nbO=rLPdz`E9ZWnGlaCwOx;_mRfFNhJ5gytm{d$eI zC+x!{9Ugw2q~5W-8cZ~zq>*k`W20=rwRPakBAVU&mW4e1Rs|5L5Dg;VJ}7UnqXeNo zhvid+Qe&n!llmlo>Vx3?lyl1-vx`J)?;WtsjPqi}>@~tx!D}ttKE~xU1@V{vCUJpE zFGQs=|JJAA5QeOnQ@A8!{!=)gKCWMH*M)h)yvD*#EN_fVcyqW96P$bmdsNQK7qSI{ zi?0*Zqj2eQBCH~ThC%rRE#ovIB5VDLItTAHZVU3}YQ7#4>c{9=Q0}3zP~Kt1!l0cc z#$-igm#>s6#LjiuI1hlyX8u#Etax$1-3dOgCpaNl5RT;pJ0&ZkJCd$T)#RB(y{DdQ z?x(26Z^D6FzLT9p2GMs=-d<^RyJauB*nLOLvc>IL5^Mb1 zdd@o6*=^4Yy+(E8#QbwaU?^T_B`473Wd1Lp%AbgblT`T&=X|I%+^~bj8Mj|>GmJ}+ z)o~+J9La}2oZkq6L|g;edzFx<+X0F7*!-X)J{n()4Nf`F;_SMw;MN%ZCcq=_M^Jv~ z6%pAn;NExmTztZwrstx45D5orvqOhspf9eP#`ygMPPoeiibO+v8G?%_zKj-U7-irE zlqCBY7u%jd@uo#-g42cdg*pUjvlcx%ZhRP%72#b2d2S12e#1sJ7oHfOBd7_AC^NF% zh@VEf@KDt)Y*Ue7@?HeR4Q0^^#uQPtVdLOQ&8!Ji1dR-2EQo~d&=}#ECnr+b@&;F5 zVhX-67L^XVC*lt~mySSgz#WWxyYK-YpUO#K<(>IIgJTE|E_O;! zlAi}zx*lTArKV^}hKpTo$1YINgSEMKG+rysf;S+`Pa3-@-C@S@De@7=`| z17MVGvjvL}u0#WZMZtJd3TU8H<9WfryngB8trJb*WBmyJfzxcCt9da3ZRlo{2afe) z!tcQ1iaViVc(Y5!jT!#>EQ6XMIBPkI7zbENb*L{AwVMIP%fluh2HO%HsiH-OhRCTfC< z4pm3Syb;yW6TQA$)Nq+eXLorqq>D@;xzhsjakKJ6opQ&E!C5N1(C2KiY9y4jSZ$;=U2?i=p6GQUbA^9kc0yr1+(&V@N`~HZ{F0O-ni?s8{jf~0} zg&sR%c7u(70wrEk5k2{;YJeLXKA^r+I0i2M3*#4Pf@9-94IiGq3IkA%0s1W-@}g<^ zWqF!ruE}`b#1xJv{CI3?Lh*FgNX5XMp`SJ4dINHVl`**KkCQR*bZaC#V=TcLV+qa} zFVcGu{TgQfazV+6eiL6-ARCE+F8K`y*y6pVYr8OaNkDN!3^zRVwvx7YD%^NTEyO^2 zF+=0fbJv9*JIHovlxrGDh?~1WVaU2^pkrWvUI-um>*E5c4H1Wu5Y^tg2^Aj?KlVqx zo(VF-6S!{8HbOgNpee3Fd?mt`g`UXx4OS!gCA9iP7XsDb)BZ-N6jvL*6c6E5yJ+`P`3)g|ta*?0!<e4Cl)?-Acy?6Ys8x<_eb{HbQ`q5W$^!mP=3pl}hra`#PO>bAxZ;D zmLIi4E7>7E3&+^s+4mWQsga4H{Acj1!yW+g_$fMEYNc?g#s9wX4TKpdV0wk7oe<$6 z-tfK=n{LY+`we8EpvA6U{hsJHH&o$+_NUvoT?Lb4vF6R=dI1Z9g=3I%dAMwd#G}7} zVq^1&ik)_xzIzdRt19r2MtNAAlwXt3=P}~TJ8)*P?W*U$$9$czOBoX2nzcAwI>eOY z0=n_fkH}y&&@+MU^E%-?=ZY8MN?#aXhR~iM+M~)t-Y%5NylTnviEFa2P7CIMCz+=XRO2qEM6-jCc01_ z@YJ&#a>DY!UV)~$5gu}6G-FL7d-K8b_~k|KNuBkB@ETj2zw@t&Q$M|!=OFsATYQ4_ zMSqDEM%Keldngv#(P@wD@{JGe@In8hj#4}HckqQJF}FLSs=)l$&@_-+zd{=$28ICp zkjEY=EkigICkO1+YPd9kd$5kU0)u&Mb>m@a#_j+{Vu%9V$(`v?co)XF^bD?`^jt7zOkE3PBlp_dQ?Yr|A@t|{h&SV83_OimqIEo6o3P7cJ$|vt^4&Ajd@3< z?$TJqOgG6}UOHjAVJDW{+l(gYNs`)4^2rflJtw1@o|E6Y!lUOO_hWR)%qua=?&Iz& z;Z^V;hzt=!=UDCu;4F&xsA%;uCZj%!lCJ<=MAsP!*vz2YXP6!L1XHYMhRZ$z+oX#B z=nIQ4JrUaFo}kJfk@5%KyAvhogrjfl3YcEDKC=c6Gdu2uIcV>cPr+!3t~T>9no~RE zUY?HoVpz+tGWNgE{_|JZEVe-Y9!!KI6KeK|9C2sJR z6IYEnvnOWGh;z}uMfDK-J|25d9w{s(rE!T`;WbmoWZ z+XL;%m&KPf;`tt(=Z|xqZ;-PD+&yj4N+sp7WbHU_2g~6`ysi{W^`@~@AGOOdTxyD0 zcsZ;{We=SZFfopk;Xckc2`p%$fU1y@dc&8sGQI55zIm>jAkor7i!Mp;>TXtV4q}FQ z33Oxj^IT+|8|Ovo$reg0p)l#vi~?g^$)6<4tkJ{CPU@LNIjj5oEbx_CEtqM6g|)I< zJm~HfTWa5sv)^7+YN7B+OZ$GiZs(v7P2UX2Fbpx?hJw}n9{v@Y*8TP?Q*0SyFs_<3ThG;%!?j;O3EH$Sy-FdeTh7hl0vAsa>=w2kd6Y+ zE=mhL>w5#CXA*^;DX;_K60W~Nd(~HeT%SXCGmSxfVYt);2Wm+VCFN^hj3OiFj)5^U zj|_m^kAZ@0$(5wDEDPQbY$KGq%rhiYJg3QB+%$8arL#T@+vBr+bLbx(z*SIR`qU!E zXOOx}Oe~?L-QU23QgM+51=HH%H)|~~kVi0`i81v&kD{gM#2qWS&au8kDLq;|1`#@i zZ0od^Md)0e_We%2rDC^2B0?^q?87T`wzXwU)6AHK@9WQUD`J7wo6_>V{Dt{Ea$1(x zzBtQo)3Utrg;{vSbT#%SSbFK-_P`rW&M~g$8aUo7u)C)crXm3kaZbR3b&cKF+Lx(a zxEn`6EEA4zQG$CcO=y^2%iv#@2cLBQg`ywv4RNgq(8QG}?_iYqdD`;jowAKcZlNFu z)YiNU{~8lLX0r}Ffa1UdL#dUkGMhisG6>u#|hPhurZbk^+3WE@2MP2(v<@4xGG(SrZb6&tA zwl5A;SrAi#2onop>!g**HXJ|D5r7*noZxA`6}F-%I~B4`2QVL?lO1fJ!quE;iS$WUltM_^EPa7SJc*~ z%5-_xZK_;f>sWUmt1{d6-^jSSe3KVlM$W<+C`b_Q7q^Q$#OK9F#7D*d5Cy@8ev|^=k={(o?(q#)5 z$@6YovTDiA^Hc`FtyHoNBCwsMhq<*IoLZk=DgfoP3?scgNYrX2rBSp~*t zI+_G>uK$LkwsLEQqhibYii!=jj+r;yaNP~)p{JsjaxC+D=pQnxttnq$fiZM!s;u=m zHdeAxG~oHd+guKJ#rkUZ28Rbsvc7tA&8CVi4&mmi8oVhZW1&NE)Ku5f#|oZt)qORT zx}dzOsv4!&R8+AN=_OzJrpgV(51Y$*H4b5371&4Tr;X*6o4oD{$GzpXj_UR6@pS_= zazXWm3P)vas>qF%RVV~?JB0Q3mRH?V;n+}F`;7{Zr@~QuZ>7hvsC3n$6(s_(CFQ!j z_KHFWjW_>KSh&(LZ_}pg_2r&Q^w=RRsV?78S#^(NapgT=Hl1i`IcB44j9|jNb=By# zr`mB(MOB3x|2CXs`l34)CF!+bxGl9K8j@|htqP1*y~&4vQf`qxd1?z8*JRsP-CKb! z*9qveK;HyMh1*^2791NejO#s|1gY7$sdAmW++A5wi!rNMU%9c8KVQ9c`l_Wa{+CEq z4ytb2RB;a`DI-)Bm?GO&4!RL-*HvIlD(|VP27y6e({!+wF*jF|vP>rYd&4W)w03yP z*MY?A%fTC!`1kHO2UTnk=51bAd5^c+izd`nde+~IjtJDj_0{)Ofz>voB@@Lb36qc^ zIrjV&8dc#@{41t9lduuxUBlE}MEu~Ws;F~pa98>&9Ghrp-NP(ZRRJaiL2Ihd6XAAeZrT(RsnS1H)DqN>`9Vc%S_x!QdnlT@23tG>afk7@d{`L`@v z_jQbdV=0quwT`b++SkyQ(rQOFf5gS!Sp#As&RF5CVspgtReFOZWt85wWICp`iT*61 z*+!EnnSrGx2l%TrEc9Y}cTy9Sx{~6Gq}+Bu(yk}5SV4l(v;d;xoIL68RdZ>{$hVTq z{MB7*k!= zVRCHR;HazI;JH^Arj_fq`AcqIkZkdnrr%!fu7Xr3bYP&Flua&?DvLRxgQZM1smoCE1twSgG#wyKIPkWQ!`^J~LZ)f=y3LI~0}RqU5%Swa%-K9rIi z`4Q_^N*tkHC>h^Cz6Hxl3o)w-@j0Dl7d{1i(z@?R`zJc}iA*m+x~#r-`ivRbw#ye> z;aE^zb074Bdp(Y8Zkly1t^OnbT~8*bZJal0N{&#SMt_V_;Qtl{wEtTLkCr=1fl&&K zQecz6d8r2*UeI?xInH^jDv zmf6-1fw#(St7DjL9YhTmjj*i^z^IY7bv5t=&;yiI*w$F!cHr;8Zs4F%wzUMP100|S z_$X*wp8$U!ZCeFnZ0mc#6~Ift-+=^h>A|*jJ+Kbg0_+2hKg70H0lR=vhuYQ|<8A9! zU>#sjpzRZF>pQ>$z$3u)NwgEl0Pjw=t;k`vHF2tKJp`0bqfdv^Mj&{EZT$dv9rz45 za=L9j1#ATZN7_~;a4K*)a5HfHQMPp@&;pcVZ(9d0px?k6;5pz!U53rE(Y3x zhk=T(Q!nsGpzvhy3>*f`0?r3M0d@lyRWlyIyTDe!s|J2z}JB90zU=*2iOdB zod&KJ+tyEjhk<8+USQH0w)I=!ty=63YZK00eI~^+j<)~ z|9tRv0W^A{ZJqKR`U>;|lfDZb0A~YN1GfSH1SWnDoCALVI)IM=`yyxzP(aQ1p+msF z*tYfnf4tPT)&uVVp8=&mfX0Bum)X|0fp1<8eFHmytFM4AfKz|SZ{VgYnLk(A)^MN} zxC*!l81p0Bnh9JBI6$HfeAPqqz(nA4pen*xN10n!(+(i;6UG%d9yl2|;HS3L2q<9u zHMaFH;EtcsR^YsA!B>NA4FgU9E(O|vV;jK}uuDFF&ilXvzze|PO^gW;0vw>YnfVDU z0UY37;F{~;Q7af1;8|eC^|tjmaLEm})dV~YJOOk8H~a#e10z~&s~Wffcn#PJjBceq z-~!;6!2Q6VfE_@|O4~XHr~&Q(#yQY1a0T!nunt&uBl8>h8L%4o1Mp{HH!!n}aRLT_ z(wo31@HOD;z*3+daDcx6TY#cpLd(E6fNul$0=s}?Z)Oev5#VWHA28$=`U6}BT(JuN z2V{UNZ?&ygffH}Dtw2=|9@m$VY7}4)g)59^>7|!70!L zJPy18lt00o0B#0u1InJHkH7;@@h))0)68YyGr)SrwzdK5o?{H+&=YVY@G7twu%2hW z0b_vaKqC+XZU^oH3SWQ@frEjGz)WB^@WU6W5BLDs4OG2ETLA~y0K5ep{3mD!SOWN7 zX08HDfu90*0viDZSg$Z9zyx3sa6a$?@IKH36n9Y9pKa^+z_Y-Mz|dErKj2VcGVpVt z$^X)@U-Ee?&)IJPAApv{24# ze7+6b#P?76Oagm>(k{k{v_tru4&2H2N@0a*Li*%p9_I+0p|lh z1U8X=EuXExeZX&klYMK-t^z&-&hf7)o9A0!wg9LBE(Cr8JONCyJ}FxaJO#W1C}4r_ zld>y-v;3cw-Q+79dMB_3co=vZU?hhY14Drkz&z`iq2B~P29m%6-!Vgf1tbB>f6UOo z0an2=L${87Ec(y4p6|kLnaJ&fV+V;z~?~RdUJReuo)QYdvo{*;80*Pa5yjrs0F?U zTn#utJMa|n8t@_TAE4O(=J4^rQ9u>&P2f!6JHVB|&w(3(yMc#*=Ye&=M&M&$Cs1L( zIedjRe8gSA?|~PA*MWZk9|MTM|G)gVx|+$edWyBaZ1q%zdi62-8${C;m`H~*GbUQ+ zUvSRZD?f6|4?z$L{cS=kUs{9Xt@HkBsjIvE0jvEDYqoDv;7)5&V5ikm)9=*uw_QAN z-k;UC3-{Nqo(jo3RSNNaR;uEvLF*t>T6L z^E&*Ndau*ZE9d-|S4!f3t5!XbQD@Nk)JBqE&nzYpwc*tj2PH@BMS*b~z zqIP06KQ@kT3HLQM_ARKZ;O_;Iawpt3D;4W_dDWVfFIm_bNcj$GPx)qT+xXEP&h>HM z+J}AZ5Bt_OSuq-IMb2(-Vmb2NA+3!2GIQd-_=eH7tM3KlV2JM1vuZ!tlSj$}$>2RK z)ej5h*)a9MfS^q!2WY4-=})#hHEHSdUv(G!%{v0Lwa21mX}`fyEM4%dAZvchGfkJTwZ+AdC?x885%HMji1SXHN090%RLg_D9EG-K7q zkL14{c-2}n#m#korS%(?`QKWT zjy0xB7=t?B{CJVId#hcOEPP@OtbyT6Uq2ozz43(W}->*RO*PJy$daHSvFCqmSLRaeG~LS53OW%5Pa; ztg&x!^ZTgCX-v0VKh4h8y-~H+SWY;78eNILER8Nmo}^2hO^E^Px#C=l`x;H$z(mirdi z>u+HYK@y~^jvr84_T^V&im0lS3@x|yTbV%J{@A06s+)@R^P8ZNn~J{T{Z*y<`KqE! zU{&dtpG)OZ{qHkmTlu#6aSt47zhQD3t;})i`V61KGFw4gW1p{XA{h0_2-qfFin@@Z z(hEWUX_eu==)dxdDsJ9ULhgasi54vG5k^V+zWOv_#*G8cDBemrVH%W84X4~j=}esg zv=yC`8PFQ;>8k04X*TxSjs4Opr~F2H)@Op&8*P)CInERw?xpBn8q^cr!24Z=!fVN# zau%oL4Jws-?2UHVS|xAmhtFBQ>FZ~GHtVw`ZtXW0!6W+4>j>nr04I2J(X3Q+`aUaK z6k|B-$Ow~E8^5Utuxph+kK=3ViT@hrwW<^-s#V(tay-JN8!2(prpUbZn~UbwSdrQ4 zml^f4jF71)5@=4Zv7!e%RbjtVJ#6i*rOt--TL0SHOKVjH{1VbUXn^^!=H@R`M02Cn zWYrCKN4vSBNmJj$`*h(leC_*FVZe$v!T!(BWR_cM$3A7lwr(%ASh8;AZ~pM=2_3(k z%*SM6RV}t14Zyh78T*848Va0IE#Wk@0iJ_56)kK|XY9HX_2htlBQqc*7A;UK_piU) zir-0*9}Lh$#@uP_aY8{BMkh2`%B$&{we7h=>&=gJ$(s4v9kaHbskZd%~R_~KeYB;JDIgSQ0Z=6P2jyy46xIo0WAfBcJ;G}?JS-XbSc4&+v`Wi8pc?W z;ZDPtriKb%v{)+Hu`j6yXB+6~i#3#4(Q+B9xAw{3f9{n&_c;w^lJynIB17}}Uj3y+ zy|`C${cfMyjpX%ZPVryH+E(lO<2TaukwOqs;61vWnS1jKfk(ig8~cSv{E&6J)EBkY zv+=H)l!zHCnArWTqcQ=$Kt!>QB27lN`k^WM+5UKd8s1OGYxsBza&sBn`gCUbfO<6@ zuO`y6B?#ePrEc>5p&qn_Bk?w`lHol>z8= z!o4zlt!ej>a7QmOV%qV;G_7tvk%>3V8D(BI^KO|u5Y{CnoRZEkv7{{rBVXm%4AY9P zOGjkhG^ecsD5u`Hpk*=CuO%_0&)kZtxk6}IW$@NgLt*W=msSR9{YFM9-N-bCY}DG! zY+q?jUrWtb6oMRf@ZQeA%|&|7Uo>cZG>g(R!x2H-pyw|cjh?xCg-2YlNBWUJrsf@y zf6vOjbBlQ=px?QCPmFi``@K}gNYwgitqkhwd8oI@FfyyEOV*xXXO^ec4@*ssl%y^y z7G55ECDXcC2B0#WsvGarq}JB@CF|2AnK=(w>T4NT<$Tgkt*q&dehUBKds{eNyZTI2 z=lllf)vB|m$BH%fTgZXo9ud9^TEab@tUG#g>vCwAIVokRqB~EzftklAVE#aN1nv_rY7Qbz# zgvs?N6{v%I@?u~M!3N^1}<>qpQ4>0W$|HGPAS@>Ba*eoTi8n~?N(q-q94ln(C@ z6wYr6@5q}+&f*=WH#;)Rcc=xs-A81S-^c9EEbnLhGRynaB?D)w3A<&=god?-w>LL# zH*4AU{5fUqcEa1ujM@cRr2n_Pn-MqMysxEn@5ksxL;CP6&-$cb`SE*xbk9opg16HN zzQoeLx^jdNP%9Jmid0gyUEFhCM_G0v>M08g*DV-H8Ja&on&Zzwp2Ql)TG2pL!w5TC z#Lv#^kv?XSo?X`uT3Vq+DX?Dzq{fsJ8s{*JEA-c~&hi2IY6-_I;)hewI*KPv4I>L8 zU(;nD>x2$*bMY=On0I3hIzR?n8G@)yfpVEaTJ+3>xv1z`Ev! zjlEKF^lUxi$FlOsxQAqcQZ>7hY`oAgH4XyTP=ID zk00BcJc`FobY%0V87uSTJ(N7Gd8^M|N)gnclFafHMG3e6g4HQ~UI*Olq-P4stY)M$ zs{jVS-O{Rso}fkkXt@(AhQN)`ikL3bxCkZDX#h84+;lBn)T$q*H>$cJUC7#2L1K+e zGQ{FXdgU|fSHF=jyzGx&(%P8HV_K~GDUWIOsb>Rv;HXrvax^b7D*R&Ih&A^5>JHUX zwGg~Npn29%*qJ9%!?R>0G`C8!#+$~DF^!e-KKhStO|hVMKC-1TPMr93K|m}GKIUkx z8kN=`D|g9YuB~%1GeY+Z!EP0TomeH3rE1hJhD|R8xwS@hKUGj}sdTTJzAL_x;uh|T zHKOkikt)CQpTsY%_$$Ke|08Tw8Y{INFH(fZ=j2{Tz=kky)CW%LeWC=EV2p*4)4-rpK3j~B4W|JaYcU95SY9cCDm*ymgQ zuEjopsw>aTd3pkKd-WqDu&obwi)r3E-iol!_E{CmsAdd8KT>xUk29I*@gjUjOXF2;=aN%&ontC#Qe>=?)+_xGXHM8( zdF>&QA=!MUf!$7HHwc~^9)Kc@+7Ky=AK;diSOo{-ISYG%6&XQMfoM@G@T|`lDO9%% zBqQF_VOFFxUg)*pJTDonEpfsFP^Mm-UdRq#9oiD*mQ;d1-W2Ie1|~VlyjdE234HBD zFaTdd>5-CDpaWx>t^To7?b`0LUC&NdjPYU~_Mf>n)HKItz++Xj*(NM+pKY(5W8dKv zuAOZs%i@!%Mua@lOg_DMF79t#}eg947AU&k^gdJqLu0{>VVt=bNH)b zc`CP-KAqrPZFrl2;q78fv~z8lQg#(pVP6SRp*&x>YR%mJtt`dJe`sol>-9|xM((0M z3b|B7hUgAi;)AnoR^1wlp5*fa!)k;bA;wB~WRb3jk3m&?8ElL3QX4CirBVpXw#+sD zc2*Z)Z5*Up4H75{LR8&;XL6ZJbGQtck+WP8m6*20!h!F~l4Sd#mX+J+-p z5nrh3%lYyv8bx#d4{ZsaK+nHA8wM)jsVtF?4N&)&By86tYDUHvo#ikbu?D{tIYbQ8 zbL`BVIktXD9ta5t4UJD0%THQ06d~ITtJp*5+Ji>5TCk8K5k!~(136&99mLec;GLrF z{#xn}510j2kM2P7oqPgj2#euddZm9Nqrb4!|IVN>VAcpLa;P3ZN)7&Zd6uGpk1;EnZ^m?gcAC|Z0jg91X`By6g@pkaAB7k^?`($5& z72z`5xqhFuW`&Pw_<;Uo@xn@ZeZTz3A>1oyJ{860+oSF z?dUk_mN%s0f?UNm2u~Im8>qK9cs1yz4$*~wJdiAm(enN4XsTM_`wqJ(eEh5)qFLb+ z^8aYnSG0IgYo_M4W;wdQi-ux#P)4oKWHE3+9tNb1QqO|ABKi1sUAd`TfBdYzs55Yb z&!3zriAS4fb4{WzIaU(KNA!C`qB^G~+dMb;_UCnKQKqTt2A>s4ssH4e55Y*lk_V#f zM|}&Wyu;Ag*tRNNFF#H)>7^Ux$Nc;!7vw*god0Bo_k{g3Z>!DY>;d?#Y+;CK)Or1e z(c@jA=*00>G^rM2AKx%qXR)mII(u!(QnwDE#i=uC{tBOz%(jW_e~1LHTRCZ+{%M{_ zSA1sAXi`V%D`=XdWh+DrVvJ!6!k9s4fO^+#7%i_J8YwfGM=rlEMKo@5E z!V0ARMnbj;lQxuw``L5YLMvsC^l2Xja1vd!nfu+ zpQ(R8>R0dRH?4@R7GcH9qg$-t!4_zchO}=Oy{5$nVrhR@O}|*v`<>fbePY|Be=U4P z_?NCCC1J(xkEO>)|B)+AvnLUK25%uoz9)+j8-Ne{%x>UP5sjjY+W#;11jop}--P}5 z1l7L zZ!SNgK{al#`#r+s;xPkQ;O-qC{5#n@epJ(?WvC>N-qpZ^YzObRgsH@X0ZANCABvq! zzI;|J{QJbN>Ix)G`Q`-Qo6s6UreEQkW=e$*w}f8zTK~X<#pMXNDGMpeijIvJdm>PY z->CwE*N{7qc-7ByfAoOtTCujopZFtYEh}E)uT{&7onQ$925MqI)}i+j4Xhl!POuEt zU(tya-dR1upZK{+{0SmPMWRlAkX(?s)UOF7I@}~6qFq}?lM}~NyU565ao3XNQB4g& zD>|W8O}-QwFjR%Di>>HVX$a=$T6Gj$S|_2W%UcD}@l93N`Q}9rR41-jTc%q~Mo|>~ znNEyCCc7)_ioFT_{6(K9pw71U%pkCa%EP$Nbx~!t>WL%JSKg;N+AG26!Ov^HKFUrU&IPYgAeiK8A{0vCRy6=Y!lk7}XgS(Wl0Wft`{igQ9c2C9SLN#LxC^ z{MU@kZ(p5o!l4%(dd{JX4%HML9?%kpHgBun{syZAGor2Gy_YVv*;dwD*XsGS5RJR= z=n11%A84%fIm5u z?2w+$9qUiLXRWqOsl#0Y#?h@-{h&YbG7L;yF~s;Vt*L6`=#!%GEluOvjiaXD9rO4% zU9w8FSuU5WpC+75Q_^rygCR>j^L<`c38XN$5M-PFwr6twD0CONh%fTM>MAL2G5Tlxc@$zE08A7HT&9nV?+Y$l_(_-j(P z?7lb^&t#@=fM;|C$}k<6Wefy5vj?M4ZB41CQd+1Gtg|3T>pU*{1L126;A?2WI6i2f z0wY{a-w^AdaMUGgW*_+KAz8-UUgoc?NnL#if9i@^K`O(&R}a_b#NAWy;>R9e=1(3F zKiKUPbs?pBHQI?QGtT)|=6D%H;UX`v_81%Ax7Wg=zf4P$QYy7e9h_3#yQH;8*Nu{o zQ|h%mHn;8*-G%xO)bDqxeZA_hI@77ql2CjYr0}PK>iUreD@4S~>(iynM8ke{iweTA2;KUvJb3Eop`8^@=3;j7U z@pJt-Dftsgo}B!#d>od%Og^S0zb7A4ljmx4XE?U^ysLM`_D)^i9osu?`F*jyhc90n z+k3?Fzr^-VU;ajH?~%*jiS0dV`CnsuXDnY6+dFgl6S2KtTmI+R-nq-~itRmT`E#+o z--h!o&&2kgyZm7(%})F{W9F8+N9>ZF)k=sNl1|Z;$an`nrj2{oUpW?RUnfF_$D%&k zoh%pZdJJyEZV$az-3NN(2W6KuFG+9as0a9!0bx?R=0wpxltAE=)fnv;#13ujI$kdQ_s)MtAE!DD* zpvOckw0fWC0NIN{o{=pJi>(M^*T4JJ)J)=Vza&MW&xT3oQqS5CJ<~%(w@H7Wu}E`r{NI9UoVjzDXT4% z#(zk5kDyx~w2F5E6SL2<60>|>hrc}gjMDr#x&jZ4oWn(KtGKSNqjh z*B%)?V$~6k9no_{>-5{F$ETMb`S0ofo__j~R~>1}@@B0}DB-sZeBM-ccUjdvtBW<2 z3m@0$K@HlbdwilKu}6*dO(T$BX)G0X;x95Q-2fG@NP;y`4OU%mMvM5w=C|l`Znh%&&Z9i)0e^ zHBdP!dVroRL*mD{Sw%;FyxXNw`SAi0gHZ*3{VT0ZOP_^u<)IRzvHqRbzqe?QDj^fY z2>0iU-lSjhtAb^gmJ-Dbs}9&>IJR!RUh?e3?jrX&`-RW%>B4-%^q1X3*(Hgupt;72 zs%}bCW9o2bUSnz+8^yA^%7&&Y*n{q+aU!o#VS5F5C9h{e7tOADq~T`oF#rZB|9 zUaKzKOJPH`KgpzUcWbyCyI*5!lujr$3G8=vAIoMGej5}-8VdWQfV{3%muY*o47by1 z+-cM}@ktPm$WR4ZT)2B75BM&R-L)w3iCg(+TBFdq-;nqr?x@5XyNA^kcGYx)gqm(~ zCckYw)`V`FHHHPnG9McV6omYH{`CC zEsKJQrwVkz+nvVkOvuvU4w#a1!pf*#J}Ysn$?&Pu_^HmYlMLIO@V0D*dXr(R)3{aK zI`p)LW3&5+$U~xjtDCnFr+X&s-ZUxvQET`EC;R~=Xr@^v?isFg2(}q{0me5>N*Du2 z9$63)ZB^rK^d8;X_vyauB{#m0lq1Bz8uPwWJ!bd!17ITYFSFlBRm9&Q6rc!@&g0uYXrfV_x6g$g` zrE27jw|S0w)3`-`kLS0x2jQ}T_@L8h9(gdA$gjjgTRYrGiZmf6&(@9I>@;qc%Fr>f zXQN|2SA+sWijNd*$C4t>pLPf6an{SC*t+;(BlX;Z6aFhs_+j_#26B+Su642L^-()= zy*^=AmYBuM-%32Imq^WKwVVi#-3iMr7A@xEUCH6}czm=pBA^d1Y)YS-$)>ZGftt{pPXTj@@-^VD{+Q)A%n#6cKipLCta5D_=yKO}xl5!0>d0 zuw@wg0>mM-RT>oX2M_8T+5G4u5q%V*{Pe`4knGk-jL{L$l&eq!do`TxYsyfv&~Vs;HXOZO@6 zG{#-c3sp<6QwaWjIthv{WDYmRQE?{HaIK~ZLNpO!3LPgVOXLqSl$i`;g^P&<0lti$ zz%*ewdsf@>?Zp3J(oRj1eNmCnCI!nu%hOKdvx1}W)2-nro$!+yMb9#u{TOeB5J$9x zVDryv&Sz4n7zRNKP823(j8JVOZ{cNTQbx9futS<^hEdJqUNw)mh97mpk5Y|Zv`NGwgs$_ItQ$t|9h~j~9!fM^j;u-OX zEcpm5vs;$o0~Zjfp&>9$%+e;4W{UZlVyKo@q)1!*e*JILGA(&Kvz!Q37PpzP#){YzYwRIVgm|%s0-lVs(v@+f zv<*)6PO-M&46LmZFlLkWH2myC>JKn+BfDyuHq=Wm=Pv8HI-oP-Fw;AilOFHrUmK-7 z%`UrGXSIIK@7|pJ+JMzt&;*jQS?l$yC+Xje1HwhO_(=%nWF%xU>6R|%zekazB426r zo%g9x2lDlGqpeG!i*T2X?Wu^AI%#K-F64C2AxusFWuQ#&z-aZ4lWUP>8@H0L?Nq-u zd znE}|Nq*Pt+_T&+)R6@Gaxa7gHy%Vn98B30G=uxIwJn)I{r*0N3>&vqm3slXgdSdp-PL;udQEt46k7!`AkVQmdF|JU zlR?cCD7rduxa_B`=gTz8^IFcJmm~vp1)t2p#d9{rJAne>GkLKm{$Ov40TY#$Lo49g zS-f3)>hJN@<;>wmNi$=KY}H+>?oGc9^b~54LupdK4<-_ZV_*%Hwwf+XdW^coBc_| z9-c^pLKPyr%WK#J-tfy#9*M{~hk)gm9V8r)UnEHkc#NIxYiitF6tNR&DcL6F3wXu| z&v|fs7FTsMc~7e_Q<@R_rJwb9NMaFPCyNYe&2HMHjinn}LefM~M!L_35XkX@N$dGx ziRT9=RrNkV=_@VOWzwNYl~X-*HX9T3TWj7R!52MPMlw2DOA*5v<3OZTS58;KgxeI6 z_aKDiiC)u6w2UE0DbUrIwczB|24$GNQ!!%{UnR4wKGBOY#Z{Z}w0-C5Kv; zM1$Ik^cNO@vz+KSq|dVGsnC=^dc3o&q$Rw`so7+6k*7;5($W-4O)pR zl=fg*I2D%Msf9X2Zc<|03CD%pa$TO5?Q;Dr^6Qo#u4xgMfD(vToV(Gdc&1aw>w^px zI!$y+^BAmK2e~dU?u@TzBrhavqYyoJ(4sU7+9pHrDXu;UJcyr4lR>Cc< zi%Oiu8=5~x`YVs6*%QcOUsORHf3nBA)b%&Gdl7O#KyaIHLpQGd-@UTK%DIPhALnQm_XH{di6xh&1-p+g7NYlz(d5IgLba7(o7s;=JW%=DC-p`yLGH0Pm%e_~p<-W3@7hT;QOZw}QdO?3>;Zpwp zhW|h3Gus!5R`L54I4-#j#?f`6dVc_ar2DsM*Dlqzf-O4r#=BZD6W6q5nK>s+#44&i z-%Y2)H0A`wpU1eXizl`$*+KEvmq*&^-Bh86h~tw?GdVn&nbTycZ*;0}yl9F-AYoGh zq~KFn8XxWT>|&j)eYDsu2vky8bX2UN*cUxOyM0&S!J-}6OS3-dN#?5*RT`WNw(v+o zye)68`ic0$~OR{J|1i7>b~n877jgnDI*c!kWR zecldw@)8w!XSMO+s4Eqf-MFcrDfO{4G{Wr3KQ^54!D(ZnFsB#X(;Rx= zbi8byPDJvqo?O&bJw<-O;NAI>bJR372HhDZCnnf8@~U^L9!GY;yQ|2!CvlR&%o@(& z$|l*!_Q!pd)rWw3Jl750j*$5heB9R>IwV&0B!@|g#kKHBpB&0~63JY=oW`4^oU@{K z*;OyU<$Ckf9pkZpB5mjTKo68CPt@cca!8iMXq`Aw9+OF4DIPtAJjFZ1wBua$~KGOzY29*;q5C{#s%6Ao#Zj`l_KPGXqE(%}3&mNU%^RB3i>lEKWJg%broX6n;; zeXz#lEA9$_94k4`9oW*~$vGw^X}W1%E1BQmx8Tk}T>%6Iv8w-5` z#ta|RRz{QsC2ubs>Lih69V>BeGr8UGuO#{e>Nm!pF*d5&*W7;RGZ%e^LADy@NQG`U zh1auMps!%;m>ViHmR@`i2JeGo&k;=>acMv9=&p)#l4&(uaY8C^{!m}E!pPFu&^_4V zuY5%;@@;Wf%Fb}eJ-=m~!-IlNw3?5wan%gCk$F1ontq88(Z(@>+%bF85s^GhHx6*t zYl*9VCTGARN9fb#u{{Nm@yEWlq*iv7)t#C4DfXRrbY5R*&o#k$I6p*07eVF$@@^q4 z_T((i1|8p^Wo{^-L+gg9t_w^A8C{+nNV=^MFZU_>jFJ<^(LG?Fa>^Y#MEI+5cWd1y|OJ*^fE;Dw=k;RdylEfyWrCNt->iE1R?6P(5?%FH=^ zq6&cPK}{dV)C5msKzD0nuO8|sr^txQ#HxQNRv>&#wRi28C0Cq#gD(2^uUHx%UBI5# z#*bQS#9rsCJBH8^J}Wy?CwX{3u)atS7d-!{r!h+`1dlpG%x2-%;^B%a*o2cB=aLsc zqvk$MBKopy9T?rs{Br$ynj%bElQQP3al#QCjVoPgX3pY?s%Kwj&Y2Tca-V(^MQI4J zTPCW1>`S6~<5z*l49HtHQN8Bo@J0C@o~WL~jKZ*Yn-L*0hD5WX(YWG{K%ZyJ^%WD{ zqv@p>lLC#4CnF_5jr@}CNzQ_38KDqxxGWsV5CcJmLp+bh>^D%D3#2mPg!+^+3QK(n z#T8-L#7!$NIr39%bC@Md0@16yWW*xEulS>5y#)DTFesC^dtdV8+!Oqnv=$~$4%&yQ z%fC&kjm^`%)$58QW__qz7E#fb{9yFoMmEAXk2CaiZ} zmRSs%E2fb`kZ6n}Tt653bmCWJ*CJLNE1Y@+*H}+p)u%*KfpcM`;yKb(^&_j4Z%<>> zg}I7dI9BDS@G6H7xR=NKW`Kpci~1u|WMuWBk8y4e;cs@NJig3rgA^nLB!^mr<#03& z*-Ksgya}dqKrVPh>AFefgm+80u|ry)kDqA~rz|bp83V!TLwT>cYw=K`@~Px=hPcZN zlaif8>nV}OX?6TAI{DfjUGbMjwf)?oYtAPIoDe_0T>WZn`b!xZOo=d3rvqQvSmj}) zVxDa7*aE?$Kh?n=@#sKR;b@lQJKeBNv0v)=8?jdkS{BQ5D>_{;8i-C7f-$2P z4+x$^hFHt$ee>yb@(|q%@m;U*9@dwz8r5mMp>u+~$Yf%6-08+6VQuWa)9wKM%`bj; zXeL8Z5nYs7dhNu=j4X(Wr2{PHaCuEEOw=PLtM?et5*cY)QznB3Ki7ou{}wBeV@>HD3m{k10`v7N&|3K2p=YY`&m_NU zw$!QsZoN4U0a2E48qU{V=bDTAOk-=Xj2BDb$v!h^tu=kkjeRd$^@Ytfe3)s1bR=V| zBRie>EPToqVaBpUOv_qzcPe?Q6ZHF0%QX!~PB7UyS<~xO7mI;T{@c|htu-l$kOYZH z0+VuwL>_4F+F2%(Quc9KAK{pET&k$eL`&4ll*Xe>In{w%SFTH%`Opk@TYX&t*o>u) z?GjJ$p~e%uQg5WPi-}*&gTjy9ZQ0K1ei5eHLjASsC!efkD(lAQuS76G&v2=i23fNU zA{QBRJ17#1JDZJco>ngITb{MdXPLAtFgPe`dvA0YONA}gMY9&?8ktG|C${5JSCA@X zds>4QrYS3gznAH~QM}L2DK7{w(8d-2k!e>b24fQnW{9r%iga?U_IOd>Wq{?0p8@bR zj>J8B%?dv zHMPQ|Fz=S;-nWv-9rCOMh9l4N$}ZAn{BaK%Jn0BM$3vR8D(JV1qX+3lK^lz(KpoI8 z1}15KVSmz;)4wAovt;~_{_6xf@**i<~+;NwD5^Uic~v8lN` zq$crpcYe*4)GWwbmzKyS5Y|X)mK@od5A1W%I?R-JPdd@$3#rdi8pCt|w?);vTeso5 zbmDb)F|re!ZUjkDLzr*wPR?TQ&gI9e2>BvsiVNx_0L)<=*WJJqLe_jVy@R9f*bb#l z_Yw`M4}Idxqw-nWjAjl6IN0La&0>Pcp_{UMPjaE@_Rd;WMc1d{*R?ahWAk^rC>6&r zd6G}=x{N3GByM9L-k&mf)#A%iZ?^b$yLjnKC96zLJ3^`>rLp+8&+&!Kuk6i~TiJS) zNO|(5@vGUBJlr@pjo7QL-p_oiW7(3k{}Z0~txG~T^8cc<9R{Gml zU75@iQ_D<%Q1rrH1Pbki0x$Noib$m)Eq42i3Kn9!QudE{i5O!o1SgX5>T)kvn1AX%D~$%t>LoJ;IinVqEZ(@I{! z7x3(tQxk;BTE-ffiT3Kh-KzF;B1YD#jgnh3A^zx<7|~cfD;K9_XMKt4-y8W=%XJSEK)x}Gv5t~jeW>zfozUPmNZh0%y_raf2o6i=3LWfGH!^`aApoZ> zVS_=RsTmTl%#IF^%DJOhajE=RoojFNb8G;4S-6!mO59(czkI<)E)9t1k~E^*OHwp&!vKZ_s@kne>W~ z={ab$zb=ntv>SKk_a7Nr+|>H?cnWu9&S7rCXf#rDyl9zd=Xy&wg}@`y$XMB#i=L%9 z5Qg2w!qXzBiktDmg_WU-tC>F))A<$a7+|St#`0&?qfrvrVUoPh6WJ?XXr47&^+V-Z zoS4Y6RI!F)+tW5)`X*;Z&^5n08U*_$H7QIOGWqmuZ6DAv>kB(d&-7e{aL-6_0Y=q; zZ+LVen}gyYg2T5{Zuw_@*1YEd%P5=8dmctJ?==rgH_Q$9W~UllX7^V9$eCtQ<3)kb zy3^@xFs4KS3;O`Eari5%*wA$1|APCql<>w<5!uiIFFAUQX4?)?F9$-lT4%RqsrlSGcqY=S6(Oh2Ke> z1l?3t8_vRMniI?4{z1_fGR%0-cM&j^eWL*#_pa&1M@q$a=pJ8NpL{#r))U|&lO z-uO6r-Sti@(f@*wh0D$_&a#X;p+&ux)*na%?7ETee9ISkyjSHs#HG1cIXO(gz;1P@ z%Fl2`HbZ?;Te!DY{Rd~oT-86yK9=ZOz3Q4B-cu>PF8j1zKRy40{I1#&HhdvroTMJc zumtV0+T715G^Zb61CtZVUlIs4Pubk>Vd9pzFyEbmdT=pRGH8OI1C|3?I(uD(Wy7R#^dKlR$M8QHWs{T8-kQ7zOtpC`5;dP@XBF}_rQ=Ez84=c zqtFhCALka393E1AI`U>ViMKQ*vZXOHK1TWP{sQcW+Pp6QA##6f%L$30b;j z;i#+7Tvv1XO`6Le^@*6UJdwe-fOaZV2qVmp%~MBw&4eMCnu4Vs9w zedP$=>{XYl#5p*ul4%R)X539F8`^rD(a9)Da~EGmGiJr-x+qNC3VvSKZHN0U)%j@A~7UZ zbvBwbL4z#+pOd2%!D?=@NRk+5m;}Bsl2XZ^&UxcX9V~G2&NHqsi z75i6ZK50_VwnQ5)$24g(=bX&8Y(6_C$rVCatA)$M{08CouUqA?JK1z+26Shh*{V}= zor$GSHAA;VknyjrQuBmQ6C+K{oIctV>!_&JTE$pSA#9=(_MlFDe=C}m?gZzpYE_sD zHZieGwAE9$CSEHxPn*-*tY}1vAMtNogXN@B?g3Q@b4DBsrP z2{JQ=zRR20_N@GL|Ll_Yt&jB_bQ{q1ak5U{yhr?U#Y@I>s9GqS1{0?=}aJSB-A15~B6-|Pv2y@K{k5}RQ(d*4YqntG5_;gM= z$!8;ZMof+7<}|FIX(K!<*;XnwEo(?tiV~z0FoyOPoPM<8$kXVm8VO!#e zqEKA1cC7~R4GZAOX;wJv^H-MowT3u{Hlk~?iSl!jl1@)pWcsRI~F zc$nqeya+oIM{B&0f3h<$;45^3Z?I>wwKMRBmWJM^Rp!V$m0VCu% zwJPaOw22eBoF~g6lK?v6ujlwA~mfNi5FA ztPRcElCwi<1Y)6~@8*t9Jsqcg=(S4JaG8PM`A~@NUglws`qkEu`o*q9!0dOsR2%V{ z&S|;D<{0dy-N|peZP1nn8WX_lM397a1cRceCjb6I42tq??-$7<&9^VUNKVWu#6)J= zYm0lLukLZpjxW5t^m57JHpF&ZKD9A0D4oTOwbnhtuLT*QV6jEdU zqe=Qzr}0&&*L8S505A9Pks&D%gQMM3A0tk9wTZQ5iOha2VwSw0hZMc;UFS95v!9gT82Bcw> z+N&0Sn3(VPo=T&S)0Be2PH>Hl2i&+5Y`95tr_H#}y=imn=Mp0(m(S332>cV9&|D{A!D4A~Q_~3<5fwlf45Vng^Ws4?)CTA0*nim<>6> z|BtML%FH}B5%t&~Rv)KBl;N(m&|6__wbERDq;;*tX+HN{nzRdRmB9}fAkt~BGkLob zI?I2fd;JhSv**9qOWY}eR)b#fuoWFoN3@0Sx%WT}$KWJ33eMIC$Z*}zojf?C8-YJm zt-4xHyGfQ}V-&mrL09N>@EE5M0rYt~i~=Z>$;-VinbouJktKkiVez(T(dW7GMTbB1^e7dvP5Yv*B%csj9PyAYq%j|=ey0~z8M zus|jAOh>q=p<8`^OQ*g_?d_Y58=TwvTL*N`BTdf3x&q_aI+kwDfa2)_R65`k?w&Hv zzjmD836AsoB1`CP9!OT0L@e)kKl?dqX{i+h ztcvob6X#kJ>g2Iy=1hmCn9^)yXdSmoUp>Kj9XYQb>nfI;DNTfGCck{qMj??RE?Ap= z(X}(FZ%MgSCGNa$)-6>FJ)b*u(lSEG=}y#ZXD%5KUHfD~8E!u+&fsyR1#PMMw82kdWW0-csBo8zJXy;=@*=50dGvyhHAKwp=_&@!P>+4+qHP`n%!09vzf*DkgqtFn# zF#lc73b+wFw|e@-S0v$uf)b&u->9?h7yH?C<27;=LU#=b1Q=w$j`SJGihtD>wp<*+ zme5Yw1W^ayue#StrfPATO6fR+Ga_t_b1EA>2#=GUq)Abm<-;HO+n}0s#^`gVmdD!~ zx91^1@{4ikLfyDZW1E(oM;fi$MBYB!wOQ-P+e7o8RC!M@RB7F6yN3%gu_NSv2}QOV zSYwRs>a;a^XT`pCrXh*8(2Lr1`vR8%NSJJ-P%BgYf=4;C&eXBl@Oo?uiF1q-k&L*% zW%C)%S8`^-h3IZC5Jq{$TJ?`LA@%Ew+Pub~smI^~8zVS11M>aoD4ahs>M?TGWz<7n z&bIJN_zAs$0Yn7Xw(ujht54@P=eEW*ZOb3YT~~S`zKOHj8Xr02tV7OP{T;4OE+ zY93;xu6c;Pd}4 zIlQZX-It5Kx+tT4srA;+xzr=U%5(J$<#=69YWgdM8B6ME?6Kh`l5`CJcg2uBN<3{LWi^f3b*lOI>)M3Hhl*$`Tq_rfCi#YQcSK=e;^Ls`=kKRxogs zHUmnyr?l~F+lWgz98c4IkI?DarmB8wCd72O!u|J#2qUQOzE`(tFLzZA(|&zOe7UZB zq;u!#a9IM=2wuB8zs~t;f_aI+#=yuXaA$SO=LQq)zej!J-Y>BRgPR|?c?Ry0#$-d& zUbHWHnk4KW%=YwsNlxXg@SSQ}T`T4U>_lqzK64{MHk9q8eJDbngOOT)Pm+)#EXzAl zuO#s1-sC8mVlyJVFM9>O{c?)9Yd{~1l6zgq-CB+4!8!fNr0 zO-6oUgJP8Uq9r@`mynTNB1=v|{nlSj->3`2wVuNcbvS%r zKo&kscuj)v_^kM;uGXg!Z>~V39pH}{)~f?vXco@(eib@QsYG$qk|K{mFK5M&xXl$% zqLO%xE4y2Ud|KW-3O!$U?NT*fJ7yBQM%{e3`uDFT)8ToU)aGC7%JYvXZ~cb-?@HFmqMju*96!}3cj$(G#5Rsl8QeuqU>ma1S4?p1 z&!c5-l@lZ62eHNve038vV^hhy4AT)I@EOX|91>#tAi7Qc{Vw(TU8aj8<9un9n*PyTXbNTXsTf#vDD$3PnUXg^w&%hK}KX0mh8hMkAPx=H#B zQfW47uPC1sEhm+7QFCSUFfaCjc4j(E6Yr)$7LVcV8g&)=;6-Thnk(r{xc~vHt7WnO z<6elhQ&e@dJJDpvM3<_cbW4gb&sc-LixoA+1a0m|V-XbyhO(0Lxndy@CDbPhQPCHs z0cB?Njdq%nrySIP#p(!uV~ywhNYN#?+$6U<#!qvJ#LFXxjneATp5#UZcMIbw81R+x zH3Ms&_NkS3cxd_kO{&41)E4h04tjE3Aew)W+Xdz7;XW&QptyJm(aCY{5OWJTq+bt^ zt}W+Kr9N9=hC^>R-6YY)@=oltRU|KFqGQyvH>+>oY<@a&Q=IlH(l<=(^weB6(qb0;95Z?w6Q^zDP z(K}qX?w5Coch=iwE4ff4yo$pw=Ij}KgJa@OV6Z$!3Jq}|WD`^54x|J1&W%YNe)`o5 z=u!QN$Ml^h%d_Y*2A3V$;G!p{rqHt=*KCvN;?(TGT%y-j#NzFPh;_Oq*2A1&51VA1 zITLGiFT1H2(#dF+Z#U#@g^q=qrK^xC9Y{{i{?sB_wn>a&r`$TJ>iXr=ow4gr5_uPE zQkZKSgshoy!*{6f3Yk7JqjIZR)}`XI>YvLUa*1lNz?26JWVQDu>vsytpuCv z{(>H<`+ImL4-|S`@{E2(PHpG=9YWm|a*=4g95=2EEb}k7*Gd%nes;__cdQ<~rY+o` zzrk|LiL_j;z9loK$EObbA7$5N1!jUqD6 zED33ctAod?2{+Qz+!YiCV+TsToq;tNGJp3p(@AbU;g;{l^l%)>YSL@&lW_9hcBkpCQOZ$#6!w*ZtJ(^2CtJyXPUm# z9PH=9!|T#RVF)#rT$h+fe>cp706d*-;Fp>^<|{4-n+2bvs`kQKOzq&Rq%&}u&C${t zn=3SA$WZo$^^$JU#YFP4k&1Sy% z!`hWZCIDoq8WirSGjO_X?tfGpDmD3k*A_y{Dp|1NS}(^VCI?PLOYa2X~=aCsO7M{HN=uIZ<2gTwW6{bgRT7z!1?jD61}r+RcK zGm$_y1g@(njuy-M_Te+omq)NBTfh2kz4-L@RQXx0L1u9nxD)p^18}%uBYC$7MNWd6wYRv>THLdxcbF z=G;C}a3mK;3x6Q85@Ht1xkx$_6MweU?;N%8rq#7(yWLLw2GPFJT={ipPQyGwBS*7v zqI)>OYq_5NxTJ8lu+_Q3M3{3zlZC|=d4)}u@C=fw z3mcLPxKyDk9_LAGH4bJX71D#r7PlrJ=n?DJoJ5Pc3{;(Q0uwM5c!;nNd10}>7OT1+ zu2ZUS8PxYVqtLuep0Z9ptXSYdE5jCM@Ih-~W$=EsH6_`XA=wc0p5yhj-mi=~?e|-i z_gk6v2T8i$b>d&O=4IAG-V%~SiM{^!)|!XhA|E(jSpCme3Q^3XtyyMa ztIJjjS7TL{XH^m8IgtztRqe{;XR;#Kq&?%hzWcFi@Y_eO^zJHE3y((*5&g!~e$`Ve zwH;f#7wDQXBJFL>H*S8`ieO?3iNk3$cc~)qube9A&D7{)eM2K0aqqQczlg1#=->2? zcwPqxB-*RDQjLKfgPraOGeOO7&ExR*&p}5Esk1XII3cx!4{p>Vh+p68dDi+e;+|z? zE-@Dw%bpjh@6tKMOM|zu2I1{{ht+;38<@O;%;@OYF8zt$TI!#FEPWYN;mpU4mWkUf z^}0#me1#-jZ>gCpy=j6P&~M2$b`$Ecj{C$q#ex5p#UMFijYeOn>DP567pwUL)RnAJ zCk&XBdFp853hRtx@-iM4OIGMhv9#CMo3|{yW$7&!@&6C}KkAkf_`mj+yKd2xDB?OU zA6fY{it3JhD*L597W__#h{OB$TcbFjAhZ;Gh*&wl=YH|~S-9E9G4woAUprC^VXl2p z-=GV18xo##oY31ztvV_dLvdWIbXdY=ul}RC3J?sWeaR7K%`H_Gt*am6ffpHjMpM;t z%e`H97Id)Oau@Ph>|^`NFXC+IMXY*7YS(BAmTO&2y)VsX>U6QtV%qm^5vEgT+P;+h zk!7!z`_*Tv`&+!Gt#0v}bfDB@v$;VplgxwvhrKtCkE+Q2hO3u!cUHn;fDpqCARr)0 zz=(t;TPH-b(cM`D0a*fMgakX?VUeX{5Yv4DQAczbb=Y)V8JI!E@Eax&NLUOe;2?q` z0^$t~h=555q5Jusy0?>nI`8v7&*y#rnuhM&TYH^4b?VfqQ|FX0EloDeGr2^$ib+(3 zboHanPb!WSVBG6T*w~UzJ=ew&;5?T&f`@q0pRso-CYmUH^_*8XT_eqDrdh&Qy8=O) z*vzxJ2P@461EDy1Zr_}}g^aSh<6!$~N!490zJ9olSRg20E*be z!tp(4{;{Rt*BMGyVFY_+VQvIoqHRl2V!XXo?V7PZ8Q*#v*xnMjW};APD(E&CYf)A;o|iv z9L>Xn6ZRiCLeRmcGeTf!QLY{U!QnLQYPGs?GZKt$3mKE40W6}@rG+coRz08yQAb=C zAwH=6l*XOq1rl^5sHi_&6eaz%g66IC3NA1^$Ih496d3^kBtO((0AnN=9L&no#DBmDyh2j3KyqC>PENI-Sf=8O`o6 z-blIsv37&6O?<-})ZXBe%eXlRO~a=cMU!-RnQy!CVwnsw`5n{>rYz-wxcVR&Vcpj% z*>B7ASR=>Dmt zZtQSyVkhq&Vt+T`-(Vwtt84*khC-x`O<#=> zvQzx^`IW#qp&9lJA69E#ap;;EbCYNmPPm6&r3ZZ~hW$ z1$JbyIW5)^xT+3EE%M!Y_=CYkzvQbp1>^fW(0F;0j#<)v7;?paPDa0H9-x)(F}a`e z-VZzNc8oSGaqFa0%caW-HyqE?tDDie971vFSt5Ge_rU$)*s&TC2!t-7Cz&oo$Uu*y zA+3z?#yq8w8kf4e@D(!oXCkG1g-q!wjr^I9cY_&LZD?heK3z_rkHzNZO&nxkBH_hu zFT={IrmI5luweH9NxRgybO~hS$lu;=V+`a=BQ^H(V%R7g=aKI6*S@f@_OL)+0#${R z5Y9wk^&<;$?=b0}XQffR@?d+TbY_`5LOQif8o0b2CN~ySYl7_;rM=7CW_oU;j7E8y zN1vx_{+}f@7h$DeIoPGgA6(!2P(5> zI9&mQg!4@z6vSlxyRAU(?OM9L=y!OtM&^#83^SArr7aF-g$f8Pk%s<0pH?fSENSD@ z8sQHc))(OK9Y?=t1_T5PpxaCw+hDL9d~$YBjm7;|jNUtoIQvFC!HmTU6DOCTjIEeJMfXF*t zW8k#?X&miB&?k?lW&oX~wH;QZ;|>wo=<5tmLb1X20Qhh#p}CM-0z+SI zC*9td8!G9I#hAgt6*n-0$*fc4vjoBoeWW2CsnZk%gxZcE-0dr&QJ&L^vkii3bM`J_ zqgndbMy~e2&yfj$28^~HhT8+=cDHnFH%#XTU{&!4YYWE`2{`e>CJ{JX4)JSxgfj#4 zLAG%_UKWpY0TowwBQ&~SL9+nNF<{fRrY-R5X$%*Q5%N<6KR#=0XRxl>cgrXr+D|^i z;MN)gE7E)iOg8D+1vGR+WX@nLCIKzYkXD8RYowhe@Ec$BCIneDK8WHjhy@t0<%wiN z;m-@|rdcgW1N7ko!ZC=-AbS%q)aM(YP-VyF8=q(UV)v&YsC2!A+Hse}a3rQ6!JW>n zA~?Wpo6SN_0p8-7o32)09dPF#Wp^K-VTsKnKYqI`eI?JLtbaA%H8vKo195WjgSBAFN^= z@%k;J*n_O)c)kcOUK)2P>#7?Mcl(gXorBP7N;i@LET4dp87NmE=k1uo- z4y{P64fjvkn5D+iMZ=2d7*CAkbtRe#ktl{udAm4}z%b;Zp z0((5b-YpC;+~#*HjM~k(VL^$=Ln^KJPz#lczTuJRQ8`3C{uLR%X$6TA?Hai7CKwdc z7a?s^wvi420<{iE*Pu~KODA3}<#Vq`Q2&_f3B3q_rVeC4K$O9RwhhuXiBE6TQ-B)&>I(l+Zm+YPsKd z-6k88zWFyz_vB_g1H<@*mB8$ZOyKo2Z^L^C19`v^G}N;Em0M&s#KS1C6z>IlD(6vS zf3TFhr?<6;xUgc;kIL5DIzNZaH}s8RtW@gebu+ppO{J0A6`ft<%?Y1?%1JifVzZlz z2b10bsUVXwJgy5_!=bm1ttaWUNr&gP6T}<#OH>>$fV4-c7`>uyYcq_p=(G#=7y?yGoT+#L=8s&a&T4;nY9Inj-dKl+>FERsvJ7&-E5IhF(L4Yu->^Q zy$}icL5&W1xz7TicngRBU4(DkGd_%@+lSDe13BVED|^>7e>F>Ke{LgVxHyMRN>sKO zW|1*=6EGHS0>EwI`qp3&Td?f3KdplA|l}u=eEoT!snI*8eO_G=-^4_$B6r?n58zY&t^Xak;)<0kKixxt5Gr07Xzb>6@LdQ zpqR3;r*WXwiA;!9>{P$t{6!XaKsdX&3{sKcP%#`P2hjpfB;JX}AwE%Q~jEjVK$7!*kmM^u}xv^hagy z?HCJV^Bq-nSae+al@N|xYZ5dI4OjB|{=fZQ7C2MhdWV^+2j z1h}rn06=BeAq4_gWe9Na98tjI)m_Dz9kl_ATtCg=G8}dD=f0Xm;x(dhT1aZxIB1tI zS^AZERoK(UU>50c7ES=^lW4i&hy>eyw6!G#0n$C^yUJ10Aoz+Q zvdU!-T=3Tjr-^8dCYeDC4(EE=UeX{yNNlpFg0ooU1G17I9t9$plzJZ0xc!yKXxw{* z2&JP9KJHk9H&yyM=nf>I`EgjP3FnJpe~p^2h|<}jY8^HS@~CSXUczd`g()W+($x~| zKKiz;cTBu{zoJa4h8ak$Y->Bj!z~LP;ReFBmx*tH_s^0x&XpDx!Gkp4;*s)arHppx zRnn3oX>yUW%mNXMz}%p0DIX2PiraRU*k6SWldMl*l%1}OfZ71`nE)qg&+mmbMg1&lduJTtQf_`;?7c2+R+a))abU7Rqvgt@&7T z+q^yv;9S-}3o#o5iSWn@RGp>Cg~UF2?K%$1#rf{>(gRoBiBgooJytq(-TkOE;Iw;$ zWNE}v-Cw?R4=QsHE@|ZFnjdUk-}bL`Yp<MhQcuFm5FMEmc-GXC|gqnC#uy@p@wzK38VKTz3YubS(Q;6o*k6B-E-f*(!;mb5@$ zcfv1j-)4OIJa?@7(Xv}(7ThemWhl8(cFP}!uQzU&-RfQPW7#bMFF)et(UOy8w?^UR zeY}h=sih2>hQ*NQ10Ar`=D};>d%F>MtcyDU=;_kSi^XhA#=9f*H=7P~bPLA&rY=IwhE;vR4|$@t5mP zvsCg*L$pfLpT%~cbU|4|Km5hw(GY>ZSWX(c;V=5v5Tug&ehm{d6w4Ys;0(UR-$q7j z7`c!DRHaW^8h!v-qSYg0<8f#aZ2FRI{E}@t&KhbF-U^)PplH~M7D>uVYlgHK3}*nM?RLF22~Pa3(&ozK;P6?FHL z2K>!!=2{U-$PfkBb>wO^OoOejvF9cRwWl7NJSyqt)(+Yuu)OQrKj1zMQRnt^Em+*= z2i5okttB~jFyTY6tsnh~wcRTTv!$+c|{K|W-r@CR& zNrZyTBe04U7?@V1zX|0&^79-Ovw>-Sy319DVgUjdp1srL!K0h6va%I&M9 z1YX@~wDAlBE9;wYa_pwAaCJyE;U|rL9@8Lk0vKh!^&_sW5q0lW1<_bRdHG2k&o_1u z6hdL9S(-6JKG?cJQf;6tDHB468D(MHt0~X%)aYh{L4Xu1nQck}-|g9y3`Gg(EE0=@ zZZ^^n%%xJTFuXL<8&jf@HhbJg()W{K++j4TA-Ve{w|f{D-jmSvJNJFcGex~Fxx;|Z zB~=`mckfudqin}(J67%3yu+t|83Zo>3O10+IF!|RU)y|^kDZF$&E%jT-0&RfK0zCj zlw+V9DGyza+}u>^9B*%5X>F5xq}1)Ad$@G(Y4=b`|AYH}X}ZVVPg={|y`^JU-Qm=< z6TE3pd_3sm2R|P1@uMG){W$UC@gLK&O6N*)skofy;RE6gNx&9V7GmD&j7=y%c4f2V zP5Xn=(Am=UeBY*Bz&(&r$qY*W-DfNML{Rw!XOQfnOZU(KztbKooF+hK4;zo(m^`)g z7WUaz-)gtN5f*~N^3+@wNqUkRdkk&d2Xk#pGT@!lN(McMUiouOAayp{zmT{if`rO> z;32}HZ}C`$wD#XJI!=SrcM?$y>x}6lS!dB)!P+mqGPzCe2>~Kx0=&Y3+`?CIESdo= z3~EfatkjPa0xoEj_hfl(HWE&T0?Vadvubn>Ah~pMrjH7MV&D{v6U66m1m{nznzYdC z9=g8Gb!C{31qm+&>*DcZ9cbfKAn;kppnM8_Z!lkao_iEjQ57v;_-Ut3JsFDO;nqtm z*z804h2BBr1;Z8Ryg+u`E8qe!=yc(X<32Jp(@8cyBYUpQYO_b<=gsxFwPJ5?Z>0pg zTH4Si9r&daVS(;E#6uWSSPSQpR`16ZD(P7`o#iGt%32~|fun=@Xt2qlvIw1yQuwtv zzI1%n+-E}jyhcn|IRq*=YAwgr3vS=f{p2_9#*v~_h7t%MZr4I)NyLVHbiX^NkCCDCzv|@-y(HDoMgKLn8k@XVXA3y}_D=U)AM&x}mdA_kg zyP?P=3+!ceU3;9OzwbvD=)&YJv!cL>fPNeY!=95H{hWrgvDETmnH*<;kjlo{S3b%8 z3ExyuFNBzFd**M&qn)K^B zAYX@I9IEis1`>~@~oO7!-+&Z@o31|aJWHg|! zZ?7oBhcITTmag~%W4HyG0gA|+M`*xV~aN%TnNpxh`+dJW1Ce0gqfsf=lX_7aXy zP~M*>S38#Hkl`VX_i$;-NTn9J_HG{OArF}mtcbfKy!E!!gS3VS22bNS20Nz+>6}MO zguxnYw5`~b(5_s%ep}Mt-JSr#e5EDWaKvK)<}i?(zvni2A+E68QQhj>(tEcn!Vx~V zV>lTJsaV-DM4EA1T7Fx4<+jqcFJy;#M13&VwD#^~T_@Hf{TXKyphw|!emcZMn%B4; zqLZRLQYpodV#qxn>0vs-;Q40IFw+jzft4B5*p?;Za5FCOOfX4vkdWWbJ9Ar#qi24c z2WJhprD1YZgtY&*bf5ej4nKa<*R9fJ%z$RHqU2!i_uQlIuHt^ViblB#Kjdws3xG>+ zOK-MH+mW|XG=@>$x{d>mxd8z42?j%!9+UJrrKAoe-Ilhr(wa#*)5GAU0LFCJh0Dk$ zIeCF}M+v9ru#*Sch6h+9>MsS}c2A%@N?0c@@7SV%-5t|bWIs9}^^=wT>dyootl%Pp zm&pjn;JunXNQVly`YP-}6>^3DLN0-NS1FKcviA{fS`nA1>6mP(L2rfQKxi@WMnKRB z*K0RaR%nS5j!|ZcSlS0NObu>+$TPNmF5j?!!z*}SsX(&dk|y1{Ynkdm?mH|~ANFlq zrsi>k0XfF>nZ|kEN6`U(m4mK=Mq+{H7Xuf0+zATunQoE0pNg$Yz4DCO%U41^a55&r zJSwR##Dg~^6ccDff9N=(T-GEtw2=0G#SWz~nt0oj{u6oOR`03k)j1wTeu+GE=ET`L zA9Wxj{VjCn)9#j6d=;n9U?N6{BVsLdQxrf=0Et#WItJHEj?)w#L#JCHsyHr)l-o+Tt)SdZpxOxxnbqP~t)R$V zK;Sks=%hRZwZe5MU&nzX(10I~D=aV;PsMj4bgcLv1x)T>{<>FrZFo?X?TtCm7cSSa zYsTZDzEZuXp{I%u)aSlb{!|=Y7qkmpOII%QsIN=|GM?xwz3zb$qnwc0N7GeB@FGil zD3WyfMj@~Lq>_<$6vvS*v>cgI=o%K$dACh21h$uX@-x1Ap5(2%pu8dx(F$BaL>|>^VN|2T=DRI!83dE zDj%#|#{bQzENuHHJp-nT*eN)e=MaJE7tUSTKpJ3SyBT)|&@g$4ZSRvbin5h04Z^h; zacR)6;&J548Jl3zQK-1&>mr3Zm@SyEM2$-5U1&gLKwdtOk~2o%Lhk)JHUzWe2(oO7 zNt##sJs4gSnr^VA@hMgguW)?D`m8BidiRc%K|_=-LR!-bABuD<(g3%r$f+k&3f)Ii0ba>Mc!@<6mwgDo^wbA|_>WRK$c1RI6l1dSI5wBN8S zJh#u_Upv;8g{L@Cf(W%nhwFFvg=8PUF8qpN2Y@;|{n_BXoA;413X}Ad%*#o)HIQV> z(%7dOb%(&LbRk{6ilm?pQUPvW+M|q@Oy^GiA~pWPFN)>JdboY$U7OacdxL5qU9Mq` z($QZy7l>2)R`&^c)7w@JjT_2LI!cnhS2mmb)IblAcg6Gc$NGP0hQW&@ogYnsoTelFphKgL-~1|w4n_2BM1~T{^1|M2r)hp*$|;rZj#SmU z3v^!xZH7qXD-VeWD?c?$Z~V;fD%!ewW45WJ1=mE}TqJ_GP368oX-@2fIgp>}sTog& zP{D-|pa#cPU^A_)Qub|{B!tj3N!lb$@)VTmLw}NNQvnIPV0q^{iL~kMDBikWr>EJw z&C)%*iq3n@QsB?t7?(!!e_Y0nNnHL_5dtu7x&tXGWLw9OUHuijc&oz!+aRDVNzrx< zQ6k^yfL7AsYi$Md?Zz(oor>k}A6(n@&~FqvLYWJ@V(u(ddiI(;l)VW2es_Q$LIwF2 zYuVVvINF1|g2le~CGz_c`JL$8;Yrcwhr0BMqa9X5zvZqo^gLATl$Z$iVQ_<07dte9 zEzp_Q7eYoS{-9~lNZxa@C$Ru>y2DS@Qpg2!#ra^R|9_C1TG9bFg$iu2rLz=wu834N zLXE*$?Se~)4LWQTX?cYV=Qx&r4E;@9Poi<#>$h2hS~=h)%lm4|oeb~T1eN15%q z__gcB+2X7R$7vBMkcx{uaa zcW$WfK04XH9qN^Wch}K-cj%>3Q2jW8+1{j5^Lm$u%x9WY;)`2)J43AO@UC7x+?rii zyCY#9vqhGN*pR%0vC>;tyW7V(T8y?pM@yhbKLA>zxXL;+NUbV&4+B?9X6wJeJX8PqxLON`-Hi=_c>}y zDy!0Xs-YGtcx}2-VMn{WwWGr7yW7u-3p|d|%+}9S{jZ}iCq?m^e;w=I3g?N}-^pmy zI_$yl1Ld%_B)h*FUOB1CvD7Qrue*XA4UXu`lVCQYZ)Ft|Z-{9+XGoSHCK<-)Sg{7o zAT|Nc7?ZF$N2t+R1T0fp=>g`{LZ_z&8a^!WsI7aJDMuR2yna)}B)Af7n^{*0b;kob-21MSk>ZT@ihAA{!aWF z=>kvLhTHmyL4yy(h9EXvgtm`2I8Jlbxj^eg?}EJWI-qr0v{j-tF zAtq_pKTekR_8tN`G&MN*`hjtCUk6;NYu}177C{`{R0EjCrf6V+nV{Phos_~@ zoTgc&6}52ynfny_6xeA0GOr3<>KwaVi#uoO)ZQv_s@CnkI2*N>{iNmj?LPz3UO(v> zR-7na)igC}QD!$OlUX}yv`)VlJXHLr-WQtUpmqznWf!q&@XtJvK^g>^lS+G-n&q@> zso96yu;4IYvP3J6S^pED0+@)A76GmCk39{Z5v{lms3|><)xzH*`qy-`3esDLDo6)u z_caKuxo5;fxNkRCg;kUj3TayVV@~_y<0^wJ)qo(uGwL4s5>j~ve5Jw6>?mSOxd2Mm z*&KxH$8^u&hK9oVU*sV}JW#I>hGr7>S~sAne9e9e>PaMWI|T8v#0>HVsI3Z|6r&2R z4@T0hYrHakVMwlwo3@j$HjMl2Dtq1C2>JXOrFLw`ReN=Zc09!(6I3dd`Te%Dq4j>C zqrUczWPllICswQgSss8PmjNj7aB@fT$2-Ce6#jp_|@-!ByW?Q%ot zsB4+hX5KOckh(MPL?g1;!YPw1P=W1H?2no*YEXC_s=?rFS}3&R%~c51p5UTd!W*rM z%$Sc|h@~A$;R|I0@g4;_GHQL#xHy^A_sYf+4}eB3(Gb(XcZ(eX`3Zwg{Aa**`Q|6| zx_wV{(-W7;V7~~X&@6pP7uCGD*@p1F58-)r`X!Pn*luWkE{77Ce6%#11%wb(8RPdo z|AK=ATy47~W-xw4ks}{bh&h+AUtXPa*#tkDi172~cwi%c3iI|>mUAhRu%}wLP{2w- zqb%dv|0PZVo7+Fx@WvbffmW3G4d_SHDb2U5VbT$hNbzjO#MFyZ)tf_@GqMWYT}R)!M3xQ!*o> zY1Z#Vbj&f|P`V5@M6s53$XM8(@z?QF$R5YV?f1#g6R;3LlHL zxY%DbdSVZhsKo>E^$i3E=y@H^lY!lNQl7Ja0CNrvVhV7@{^4wWC+sWo@+M`OF9!TS zK2g0T0rgktUu=nCK{ri_PRs~!e6RQHaSb{816pZS53lrfYl==hCUz31;HWP^EC~?{ zgVt2{cO^69Xc#9O9c~L=Q`5g(pLn)mc%?gVZS;BZq}Y9My|X(3`i{>!eO9$)vL1+o*GZX?hUL`%X5dHVQG;PELJw3P{%+6qnyUR?rkDm zbBM)JBs%(y>GvZ|zb#Ix*AU#j!-4VGnXF(Zm<)oV`6MnyTTIRXdql zfu=K8Ta%&#zAuLa$&Vh@92DBpabB-&JO#sLP73aij+Xw(-VkrepotTE?-&cHeD~%X zJTg*Tt~GN8WD-w+rci#pIF1LtS)+%;YMLhCPcWe13A*nHb?@HsP;Jx@^)KO-n;gR7 z!x(~e9oWWbak2s3LcuEd5LvF(EZ2#-IzC@YTbSA!=*-ng4?(hmxGf21+;|25D>p1e zJibfCM>}>80$tsbY-+imyCDbsvzVgOTpa^Y++&)6CVvL+Iz8AE6A?osFDTBLqH}36g})E1 zoKhwCH-I`j4xM#}QV&h&;(!V0>7FMhq97=nFVJePR%^opEA1-IW`OT zS##<$oL+n)WJz;d^Qy8Ym~yv`*l`~g*Wum?S-Fw>Up*t#M)jUrR-?`HR6cRmJ$2#} zd4~@_F)7bH;l6RKy#EnlQ=QOHwdo7ta5lt20{iUY4N@1)|BaaJWDzYCWk@`J(m5UM;J{sI)+o2*{7f6cd(Z^bzKhqCOPToh$$ z1!cyaly73zOzjdQE)Pu+(><<4zmybri1;vm1H@|a-{MtqujZf>c!v9e?A9#Ewp9Or_>+Pbs#U)3M0uRGfqc#wu) zRh8%d1-)!`)ivygE0}l3*)O~sXAg5-`otlv_S(m8ZQ)24|9=6N*+#;69>C9F3L+#g!-NUHk5X{d6cHXVK*~ zS^st2sk{F=m-sm?8fTiSJfccE3v2TBB_D}(AGw+xUpQQ+#as22j#jVjhkmNM1FQbM z2K&k{g;<~!#DR&o%c=vMcyHV<*jJWAH+Zx&Nnh2t|0!Gd#{F?%%J1`1ly-!}t?suR z4WrF)dwz{C{|lZqd*7zdn*CL)_OJR*JiY4Znv;}LOwu>*ci2B%Qv>KE@*cjcvJZLT zJJu-7*z02N@= zonvb|94_13$1zAcZA%cu`P&^Y^pcQ&bxH_2C! zMiP0^E}m3X)$rb}a--fo#5T!wTZ&~EOaeq>waPxo=h&h2Y$rz`AFCPx2BNM6w3juG zmsPdXt9RD}1Hf3Ws#|j+M?nGfOC$BZJr(G)>Vyw96eQf;qJU$~2~eTEFL>md@9X3U z4vhn9IL^b=f&A}-F2gX1v+Ihl(yWf zU9d6QE3Lg{-z3(oJiGFY>pBW;+JkejfTp^pqp-1Ec9gY4U`z`Q6sHZV_D|JU*#{0k z`jL1-+=~^U$0F=uf*d>6l-*jsz;ER($0dX3^ZIj(TEtroe`u9byyBrh#U8S2F%7Du zUg(Yc7yH!haWnwpiQ$!jrxpb}4mz5SHXSS5s{&oJYcU7H{UWtgp8v{QD^IVy_JDzn zuRmLV42c_jD5ZdS(oF@#9-#Y%={84dG{dYu!>QBWzqZ;q}&eiJpBF^z+<$d1eer(?&aP}A>Yv34f zqD|xY!r=HqbyrL3n|&==qHh>1oOvZMz_ zOyfAH66+y{#F&=-6uRI?+jtm%_v)4m4xq>*D%Ww>&#qdR8<1^w?TbEN_LE^jCtF_( zYdrxW#r}&s?1e8H_l`sALxQ}F)So=tD1I?TZ1x4`W!0a_n?G1RqHCI}>yw(UOZ-Z` z-rgmhF?6RebSLB9V+IH@O8;VtI45jSW=uQXM!CpEp4)ZK=t{ypqTeWtZHqdJa0SGPW={aC~M7#x&>Y?FB-3?7O&`k<2yJEmu_iFYU zCR&Z_mg`$rgX@UvTJ+J^s3i+}mU>xe@xTn*T%}`QQGoR)_dUs_9?bBWSmAg}d1|+# z#j!wdjRYmK^>kFL%Iaxl1_9^2(#u(f)tz^ocQ`(ebA2h+h#2bfhn?vv=VXo3=vSVt zciIiubBJ}0Lvi8(V8&HQO_2zfI8*sZ11&I|-(sM_`yY2L(MK=UJAQOL;MHjM1Xh;p z16CIw!PrWV;nIfVkSdS&pp&op?|Johjr*-Q89uxZ8|p4K7`=o=GU@@rk_>YBc2so~ z{(C%{g@?y@^u=$t)rT5@_R$A9;@5rjve>kGY_(7xoFb#<7JdE2`V$12Y-tS3l^(_S zVSIxHmh2-AchE)sEj#jtAO7xzI| zk`7k-_X;lDUfd^S4?iWk#h`QHFNwkD3{BsQl6Xke!sHC*jjrje=0Mkz*=S#q8jT1M z??I?R4z2%pUf`ZAIU=|{{fVv@haVKRNZkp0XeBuU>+2!C=b==FKgvKLa4Ihl`*Dge zH1*#nXr!)(L_hg$FMmVxc-k2K~_Zjia^4f(g;5Tprgo*RdCF)t#yP`XyIw^yPCC z95+LjbO9(dj>9VP*zi-1hEVIhwo#6oe#-{5lcnn*Nw*yhh6P=1y;1Wq&mMa-6!|=^ zu{;9VHt`P?>;Du1R?rU{*iCIk^p zI0kmkvk#m7Tdw0(i!?$0RogU+|m3eOf&rbl);bV1A(*@v2%bOfRd5zy|YOpmrkw*=p z#sr+V>)bD)a#zC~FO9*qbE6QZX;|i^DjleD&=2!Ps?v2O`k?EqYY)z$zM`ot^<+6x zXNH-3oX^}z?)SF&H6(juj}=EYT^FwouRM1T8c^Nzebb3vE#g(=z|v%!@s+`~J1S zp1KS5$Li|pFPv?xtLD6M*9B^@V#2GR#YWP8CNKuqCd8>hdppl=OwlFmz6oYtQSO z3!>b)!%yM3VquJUK)Of0aBvpJv;WgkSOzYNRZT;mjsgJ;#jHAE4an0RK=)y#`*@xM zr6Hx;pC00fo5(@IPCw^lb?qan+A$3QP-c(@t3^bQPJ#@@X!Fl-N0c56VQy{dLABN& z5z-A+mb6rr7jS-&y6Kcy?>g={JJ259SRD%Ou7hz6g35~yV5RJ?a@49CI%D~7+^dCw zyo2h-y=pm4E2EOckb)@9VNFPJR1OxXoJD?)kU3Ftr8m8*WtxW9S?NucXDL}j6Mqgo zh`PR(VRr;C`r1*IwPW0V9LDHE?Zb}RN4~EegF&1fVw=0uyBv#B-vhA+Y^FxtoG6E_ z7o~V~5mJtEge-}|b5A@!G7W_ocxF6-G8)xmn8S{C%#ISKh<@T^_0-x&5#<8lv1K;Q z)4RjhPLabXk;)yYyb&-7Y+^lzOOH~DgWZ9px1dbuM=v-%DT>lB3v?VbxOH;=$%ms4 z4zG;Vqxm1u2mBdf%_E<6xeqN}j+ROj*uu_EzuJ+H;w@HHJBp#X7pr!8mrJj*ArDz+ zjrLzKJ^H+(R$Y4Q^PmMk)}Pbh?ht-YEIj4@Mw&rs5=Q$kQxDOP(mfruGzN{ACb7{& zZIOr>h}``e_lMeoJO>@M2CuFtD*AktqgHU=XxwkG`+IfI08XLq+KlK*&jBzRlE6kk zU<({Q*rtUPwaT-v%JX>@WH_UzS#_fqFHrZJS``~JFKTI*4@V2OUq<`eejXiQy9`-e zLsfJoUA7jN=}0J^0ik%%`k5Fhr_tb?91wlknI1G5XQU+Ghw7Ye4UQQ~0@h3kdix{C zCFmF4x151{KJfugA`HKgrv6Ob3CBKlv48&>qsQwFUhb7sUL@nGcg*Miy_ejCh%EE4 zQKRF{=_6x?rkj&8&13P5r(^*iW|@;Oq!-Mv78MuGvI*(&iKa{;zPLDl-t@WoR!Y(K z`K|iA&CKAS2yGnw%Fp!l|MH{ykLk54=r;WK^BWL=l@sNoVp_N-3SjM!QsJ4xLYctg zn1ewr?5+S`-n;(_(GQM%aAdTQ0}Qx3?*H%iHuU?QhyU-}<7M98sYC^k5>Ws9`7Z?i z3xWSa;J*;~F9iMzf&W6lA0LfMO)MEcDqMR|F^yWSCN@^BQETX<)~Z=0xH9_Z`_PjE zyjmsyQjCBQbN=jk`GvM(VOrr#VYao%KEHUBdC|P-MRSWsb!3YC%>|3|{in?>m|f^U zqiEjrg2H_N8FQx<7YqKDMf3ChbEeI;=ljRoY#rG8%=!6+Lb0y`{x;uQG$Vhe-I`w< z&);Vh70xWM6%-Xt>VJ;9sPBPAvKf9n9;li}J*8FKR7YQ@- zXCZbbkIpW9y0B;g(1GKYU<1x{DA|AAmGtT zy@g10XO&89p>5j2Uja!enI?r$Fn4bL>}hkADs1@+ZAz?pPLX}?OkvKnl6+x0HJHyl zp>WzfYFWCy*oI(KipE+2Ks1qhBn+eMN~<^o?Zwk(w^!34wrvOsX3fIvD6|Pr7hr<7 zLlQGE-&%sQ7Zh3L5fX&tBI|-_c(dm7JTp*oaa$kST4nVOGga62$+Z>%V|b%5es`zw z^++KG0?g6?Z zye-CppcLGO8zs}MLxj20rsvP4Zedy#+ol!TeDxOFto9i;5dS->PRmDkixhBnC|+JS zGC^MMh{U|$PwLksa{H9Hlwn8$cOjfzL$jKyFgA?wE(E^OSkw8ww6nUuIMO zTp30GV4pYtSH-9DPRuMQoq5Z5+qh?>&J2j}=aLZA|sULasr&)!^(z6~+j897wKzC-g z(Qg!z#wXT{X@vu9^3s8dhjQX!Etr|l+su)wXg>@0=$wXJj*I^S~Ek)TmZMA?dpKyj=XILZ!oC(neoGA(@k0j37-jOalcTGr<9L%uADWmaw3GNu^kmZ{0<9 zAOLcs!@l)eNG!0bxFl zn|oxu*CTUlkF3Ak}5AU`+dz(c#86ge2}@#>7lh(r3(=LV)-?p~g-Y|A(Fl zg*}ssdnPaHnX$Czgy(u%%6sOn>B$nz4u%O+%5sru1&cR{%ouN4#b3)A%_SE@%yTUM zJt`sb!=CB?=$Tc~(|nL;w{U=GW~^k!^i0zer38l+@uv7P85YbEpZGX{bGv7fD%|K7 zo?-|e9~_?6B|KdS&lnh<`EYpF*l=?~xFtJ0cS?BP%!}mb!||!+@+Y#4D_LriW&CsK)t{IJ?=P@Ge6X!m`5O#cmBx=g zdOx+lUXML3#RUci1nBiTUAzSoL8dPPfeYL}x=Oz(M$jn^fh^u}Gxb|Y1TJP~aC)Sq zPvY4o@Lvm$$N;oKr|3tBAJi)`u2<5WUPgPb@r!z;F75T$x?XA5dZiDE$cT@~d^{p+ zLWF60g!zRCOI1Yffrz}?2o@h-8lUuBe0o{Dc|}s<^GQi7Gm>6lz@74hTxVLMD=kS( zOI?+oxH>&+O?sC3MSK(1;wSf|+$6v;{*`$1AB~Bxrsk|;=ET=nn&owtl$!IW^z5|t z8Gp`5d?Um1W`-s6EtApm7Z$%E-ncPgQ-X1G;+Dj`iEkUCGuE3$TF z8UH6M^PlG36aU5H$0t`Bm(29R`Q8#^Z2jv zO+LvI(@rItzAB)YM$6gEv~!uJ^VFyx;?pj~n|@44kP_p~ z4frNp#80k!eA=b)rpuPZE0(06EU8y5ndYDIO}K`i-0Rs1H<;0E`Gv)&S{hm6_>`u! zcuOhtlqc( z>W3eGboTo*XTIOGWy{-I&04kLLf)HMZ>TlbuV1@%y^5*c(&~F`-TF7J-_6^%-hcmt zfh+#J_N%WRiuR9;4~b0Z8JQRrne=d^F)K3J5}Eo$WZFxS>ANB`sv@&~iZtDhH2e3q zJlZ>VOz*se-cMxqW_jtuNCVjbEEm36 zpj(NET9s-}U7ebl9>As zvjrvXFk8&IAG3H%e8wjxWBRA~yA$*;HN*0m*^+6hU`W0T3ytxACYUV$wCqO4e^I_l zOV%Fb+?$88pLR+ z*-WcDulh6lL8VgNQ2ngBNv-q!$|+ABg|T|n`xO2@70Q?c{|tCb!uv3!5LiF_6^!G?2}TGPAAq#cBxHjQmaEvi zY#?JJnedc$uH`9q<>W?@LziJXXA|6+=45f1!MvoxOfGEF@$0NRX878Vu~5bDjjhs zPR-@Q{!F0H(Et4J0m0utLzpJa6Y~B2S^6~6b{WOm!URO8J7RjhG$BVY8B+v-W!UFU&$k*Of54u=Ka=kf2}%5!zfqABG5?ggMboFvWqjf(d%c0h z_mAT5?Xvq(WP^ake)xU$hv4y=%Ca>MWDsy{DYMAeo#J2%|sVFe7*^CgBk>|FN3}g z$_tqs5@i4jiT7)INk1=Oc0h#oTXg{2q}!|Q<+n;ZLwDypNb#_~8Sy0Kr;o!sPJY1e z26ddu_j1554h*XNX)(lUl*hO?g5ofL_$RBXQyeHe|Ma`jB@XycAIG}a!{Tr`n?Az- z?Cu%INjzf%pS}_ir_leK>Q{w0nWDvgnpn{{E|4b=efvwPe;ig2dbZyFI?=QCUk7`w84-sG%Gmy)|FdcPBXOPa7*{gt>A=&Y;)o_m zPHo>B*VwqOc%J^@e)qzU;^VrZjf=Z~+W)H)NpZLavi8Hm=!Gj^7#|k~(>=KXjC+i<>s#i4~@}p6tNeJ=cErcG26}ap7!KC*j6`7Y`rF zi|fT^>Cb+V_4pTcAICkyF0P&*KJ$v|WPbcymNZuQXTiorfB7Kc2>Vmh7q?cd7uMe% z=cDE`(JuN(3V=fg$nP6g$|Dh%zNPjn2 zGkOrP;}(ZrpNPMX>MhGwQzd(fuC45gzplv(jWbZm%)kEQlQVa$1v_z}^u#J%Ki0CQ zuD=+mW`j?Z-eRH4G`m>Ns$>KVRpe>zl$uYv7iBb|}mV8I}a z?$<)mTkY1@=y9c}O6`p7!Ah$RATENf56ARa--{gzg2JXX_#zs`c6A%DlZ_l)HQuR* zIxqA=qo|~s6!g*CNxX%UWpg?yYFuXJcb^Yag2PPO?N6pBUj-5bsZtb#hI^ zhF>)j20_XwmsF0M>VB2pEV3w0O|m!pEL+c{=mI$!G0x|8+)^&JncBFHw{Zmm56G9v zUK49HEo2HA_FG>d^XyEGU?}d?wrAvNf1#HLxi1s}5O(J0MP0i#x$Ydr6DZ9jn$o z(A|@&MZ=d}(=2N(_v0R;m0`%amH;C(+*|Gzn4aPO7hB8k5tCsLuW|BTn9-@%8({kx zMxVKT8rg`e5uW>~EsZG8F-EWrq`sx`XXDn_U(?(yzsCo#SZw1tFvh^Ps1FVC zIEGNM7_e)m*lOd4%$-KIw0nCWk^Tr{yztxopD+-i3K%)Y>i zwWeVqihLgsen%-8W4a|a=N&5?6~E)mc~@Nau4vxMN2Yo3viCKf^6X?W=UrrY7elhe z{vFRYIOlz;U@2UCBKCb}&Ze?un^e}Qn&fwB(3K)IOAxPZ&%Fr_v3V|Jp$PdoJ2|>B z@F-}54YWZC(ozrz1MHFnf-u0>96Zv>^I)c5XbzvBkucK>`eN{)Tm1+Pmc6yww&AmQ z?onzB4>+^hcJ?!WIl$dz^|CX&g=pV%4T|m<0ur)%%8k21b`8BFjf0b!)o=~Hg z)G#Dm{c4cMRB;iw_}(qx;s~BM74yGKOh zjt4pM+LDbM)aA)nsG?Dzuq`)HcuyqU7dbN8IoY(zXc0@$`q9x&OO|^gB^!!l$0*rA zdLuduOGSH4riznjT+ppw*V~VG*QBXQzC^INB$}@i(ac81OF+>}Wi48}gft={70g^e zj_0zPdP_alX4sY-yeKgtHggP~ncndF@92;@t6Z+k-6 zilbE8)g^EF@D3f3R@?+JulB=)hs`Q7n)FRec14`hJ2;iB#Vc$+^Ufxlq}_O>k)gh4 znWVqrwH*}F1|a{H)w8Zn-W$TC*=m?+q7`7g(gS)nMVsJpmv<;Ix$#a46r&EgrrH5&=I#2m4 zK)-c54^rqnkHsRH{o9(Agp1WH4IWi>@>x(g$iKN2$ETvvU-(OY11>;p(cTzqw3Ob; z7uw;f?1~{6?(`5yM9$M=NgoTx*x3Q{o0{Irv%@y_LA(0Ij0uCCk%k3c#S>_xi7&3Q@m;t`tN3e7 z2gB2Hu+L5CeAcYN>>)$8VX@l)r)PXuOa1hTBwM|I|o3qUhJi-?i!`fpm#D#%3t z9br!f({#8a3~td5u!doCe2h@|KIh8OO2u^^4$0MfHWGX%&i3BMW~w$KjSj9=(e<^jD~ zB7PBzUxbj_Bul`r24Z>0y;%}|5k8(|i3#}CR-K0y$X`c!t;akE{m3cFVsGR`6MiU=i>!ioj+zu<7-$TkMv3 zM=0b pP=CNIdtkQ{*?CB3ErUkfEzDdTLm=aEpoqW#Y!DR+7!qU)0034a&Ex<8 literal 0 HcmV?d00001 diff --git a/v2.0/bin/MORE.COM b/v2.0/bin/MORE.COM new file mode 100644 index 0000000000000000000000000000000000000000..b28f8070d4f0a11865b611e5c869139761f39cb8 GIT binary patch literal 4364 zcmdmDa8|MHfh_}5G3Tx~j9WO*DxOu?#m)p`7~kIFdRDRf#TL7>io2N@K%76jxR`b_ z2z1}wVt-bV`#>qvS%vNs-JjOjNR@oG;Vor9#&(yH@wJZ)S1H>+wmXckooqNtc^mA2 zf+gnv`0g^kHnia^73xyE%h+&)z2V7^e@8li?AOvZ3Ps}ofO1V$iTp> ztE=FfUzDn#tE=McALMGK;F*`4UsRNuT%zFOAFNQ8T2!2wpU2Ck!Y~R(Ltr!nMnhmU i1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3OK2mk;%JZ7c< literal 0 HcmV?d00001 diff --git a/v2.0/bin/MSDOS.SYS b/v2.0/bin/MSDOS.SYS new file mode 100644 index 0000000000000000000000000000000000000000..803eb7004b3e3d0093d955565beff7ec39f5b8c4 GIT binary patch literal 16690 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 literal 0 HcmV?d00001 diff --git a/v2.0/bin/PROFIL.OBJ b/v2.0/bin/PROFIL.OBJ new file mode 100644 index 0000000000000000000000000000000000000000..66946b38a4c8aeb807f4eaadc1b36a600cb693d8 GIT binary patch literal 2304 zcmb7`e@t7~701tc&zKkrcojoirrFPgkfdpuG>0|B>SOO{1GJn$d5Ka{GRF5SPdX8j7<4Krk2jymZe)7NEPpU zpVwvDe|z?OpL@?a_ug~QJLlT5Wn}gG8tb?1_|5C(M3%b7tscwPExWczTOYSfv}jrH|Zm~SdP1tQKNRf|Yu5RDL^l);^eCaI8jeB*8)%yR!7z-~&R{@U9qeq6gx2*2+Se!> zzp2!&S2ihC4bfm*Afkl!D`9`ck6?s5dX?2*t5w>bR|CCklrWTS(e|!@3S%!!f&m1p zS5ZSsI3GO7hlZY&u*J{bAzC2PDu_m_Gp?kSXwO)jhTnFVM3>@!J4!#PJ|3g*jJ47! zUXyVhC&969GMj_rVq9z^!lcR{6CEQeaMFlnW?Y+HN%!J6%IL(4G~hU5&i};Ax2Dc( zOWLjYN6>wk z^aBk-*vdw7yqeeLN{OOZ_z`RZch)&+eHL&1TrQ{G!}KB`)yJ%Kg6Q6b>JwISU}SRk zOw63#DLkCIG5Lx}jlQh(;y*<|9ED3Fq_w!Qk}%P*2F3|xaz?ve^ShnCJ;|%d$-D1s zbMg5y5wfhD^7d%)czZKfd^;*>AB?WbxYjQAT_HEOG^@+xDeX$})#&76Y6*MH zTEuhkz2t22BHpAA>)ve<(U^qa(&te)Z6g^Th?uO-xCHDXUQ3QrC-yY}2b<3lHF>Q$ z_$=<7KJAaS`qQOa3Z5+tPRJ7*FkeKu|Lj%PLQ*sRso3T0)QucMkhSL^%NChWi+Hv? zxv#m@4LdQBcmZZbQ3?^)KYH9tg9(0r(#4TYyg1JwS*P+wIH`N_qo& zPqE$!Jjr?-*vtAa0nG9?@D0*O0Y4|kFd!!BI(qe_XMiB|vuCUU0&LU(O>77URW=?65^VT@2=_NzSu$GD?quV;0PLOt zFk=UR!CgR@jS$eq#=GS(Pob@laRJCt|3xdaF^6_L8CQV_8-E6{(qDkxWc7*4s!YlAi-%b@Diu@05MJr?~n2; zLl;>_vb54@S;kd4u3C{WDDIle1CD$#pKGNt66N&CuYViK%VC4qp^(#$P@i~8VSO}92tLlxmYk?dPUM%wZ?}AYtc(=QT+3D+ z>qZIn5RQnxX;Cu^D|2Nd56sNR=jmqgd6DwO-h57OMq(qUr>@B) zO&k{H_pF^{RDf9p@~lA3bn<+)R&kVs(~iRb+0j|I*jau@_f@AVSE7?~om^oeRWm(8 z!w;{IINY{F%i~Kw{c^8!gqyUvsrjjSd1h+pvub@zkKWGC!S-Yc+&Nj~^;I4D(WsPh zwKS)^!)`^r>$a(%HZ;fFC8>39KEnC~c)OQ4QHI1$v+hK1H|eYM5Q)9O38ae9J&N86 zDY4nkaxW+9fOpI~lsB=y6S{+}i_{LWE>at1b<{*+0K-$P52A+}73GLBeiy)i2|#7D zDif?OV literal 0 HcmV?d00001 diff --git a/v2.0/bin/PROFILE.DOC b/v2.0/bin/PROFILE.DOC new file mode 100644 index 0000000000000000000000000000000000000000..2d50631bee34d5f03a607a81606054700842a571 GIT binary patch literal 3968 zcmbtX?@t>?5bbAF{)Z7?3K19@sa2Fnm5^gnD*+?hw5h5Jt?$;pOYUwjyLTA3>i^#N zcK42>Bub?k39xT|&zm=6k;kvg#mVd0LayhtH}msL{=JyKo6Pt39*gna#cVF4$@__n z#V%8D^{C@QO2QgOU`RMFSLLC0R4@M~ML^}N!XD@y{#jh9QcCOJS9&NKc z$wV@B2ZvomrCPyDUNzdX5x32l+knx)P1#&!BW zvFYh77SM;wTnQG3+?*+4AWt=NWM-M!!qe$2=))QXWrY}#CS*DYpnM1kb%lRaQWY?! zx|9$_&}Sr~RtCMI(@q&dt7F-jR;0`~87j8X_~p|;5;Pj)UsKBVidLhcD5et_*2Vgm z(AgNg&(v<4TRr*$a(fHD?UjKyqNPgF5mAT{(5=#w*6A2|4D}c(HDVQ_M`0nz8l?IT zanxP2jVVwHS)!UvmdDD&8e)VOsCaj^vQ3_}g|fv?tXZ|LVeo64L$ufhM<_$oXSqI@ zm87Q9q0lm$TuMo`t<8Za1aduoHyghdn8VCf=;NW&v2x+j=zMW`)QwCI3db?6$a7!0?b;=;Ym!Y zk5QFanNKY==L+ZQXgAVQV!yoiHx2z#-yuF=XEhqCq znb1GG6M6lf_)9FuKqsb33F-5oA6#Et^uB}ZwmL}(w-_1a<6yj-oc}VRr=Z`pBt}da zSnX<4xtvtx2bJ-uq-j+l2h;gvc`&FSpM}hNR--eH8G7tf1IPb7T`Yk|le8or-x)sv zQ&9QM;{44MA_uHVv6i^h)t&hW{I7P>HegOP>*a8KxB$W)k#(g?J<|70_Z)NuNoPhHZKa_u_{0cftGc{>GYIF zPgPs4y72^6VW1SYQJsMdD$uHq>;sESjA0ZxhLxFjvS`0@*RisE=}eCdJtDu*vRJfy(*) zQYhz3+7m02$3i3L_ehVF1(&ki)o|e3Gmw-IC`IrOCdbJ zOGZ(U_IiT7nk^?UWeOu8qJx!6u?u720=N(y+Q;rOj=1btst^Iug=Yhd`+OOZ#{zi8 z>aIk+S8DyrRY{v&obUv$;aWHb*V9UWLCTa(69Wzr z`_&Y@o1!pVqFKg4zaf5HV_UG3U#j2k?}fK4`Z`sOlD{B|C1B&)xWz2y)hm(HXENs5 zCCCv}&|?|@JOsx+4qu*zPa+FHJMB#e*xUkGuuRj;sxb{H^XZg6)dSq3-c=az$GlO4 z2qQ2Dx`fp&3UXVkkPdxbcWg88%i=+<SP))6@^60`?jY|l=J+Ll zZH=J6T*v?7FEuWt=7ao-Kc0>_0l(rA+ms3I@4;F>o`ccmQ67+=wAS)eaC+l!5AGSlhuQ78`CS3QB=)WFtAHuW0ilg6wpQ;a&A2K(T zA=EZb8$P--*anN}&shXwuSf4%+zS<$pk literal 0 HcmV?d00001 diff --git a/v2.0/bin/PROHST.EXE b/v2.0/bin/PROHST.EXE new file mode 100644 index 0000000000000000000000000000000000000000..dfa8983fbf5d4dc8a7fb33faf0e01ad832237c5d GIT binary patch literal 41728 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 '0' AND THEN ch <= '9' THEN BEGIN + hex_char := WRD (ch) - WRD ('0'); + END + ELSE IF ch >= 'A' AND THEN ch <= 'F' THEN BEGIN + hex_char := WRD (ch) - WRD ('A') + 10; + END + ELSE BEGIN + WRITELN ('Invalid hex character'); + hex_char := 0; + END {IF}; +END {hex_char}; + + +FUNCTION read_hex (i :WORD): WORD; +VAR + hex_val: WORD; +BEGIN + skip_spaces; + hex_val := 0; + WHILE NOT eof (map) AND THEN i <> 0 DO BEGIN + hex_val := hex_val * 16 + hex_char (map^); + GET (map); + i := i - 1; + END {WHILE}; + read_hex := hex_val; +END {read_hex}; + +FUNCTION read_h: WORD; +BEGIN + read_h := read_hex (4); + get (map); + get (map); +END; + +FUNCTION read_word: WORD; +VAR + int_value: WORD; +BEGIN + int_value := 0; + IF NOT EOF (map) THEN BEGIN + READ (map, int_value); + END {IF}; + read_word := int_value; +END {read_word}; + + +FUNCTION map_digit: BOOLEAN; +BEGIN + map_digit := (map^ >= '0') OR (map^ <= '9'); +END {map_digit}; + +BEGIN {prohst} + writeln (output, ' Profile Histogram Utility - Version 1.0'); + writeln (output); + writeln (output, ' Copyright - Microsoft, 1983'); + + start := ' '; + + filbm (bucket_name, hist_name, map_name, switches); + + IF 31 IN switches THEN BEGIN + ABORT ('Map file must not be terminal', 0, 0); + END {IF}; + + IF NOT (28 IN switches) THEN BEGIN + ABORT ('No histogram file specified', 0, 0); + END {IF}; + + ASSIGN (bucket, bucket_name); + reset (bucket); + ASSIGN (hist, hist_name); + rewrite (hist); + + map_avail := 29 IN switches; + line_nos_avail := FALSE; + + IF map_avail THEN BEGIN + ASSIGN (map, map_name); + RESET (map); + + WHILE NOT EOF (map) AND THEN start <> ' Start' DO BEGIN + READLN (map, start); + END {WHILE}; + + NEW (first_address); + this_address := NIL; + + WHILE NOT EOF(map) DO BEGIN + READLN (map, line); + IF line.len < 6 OR ELSE line [2] < '0' OR ELSE + line [2] > '9' THEN BEGIN + BREAK; + END {IF}; + + IF this_address <> NIL THEN BEGIN + NEW (this_address^.next); + this_address := this_address^.next; + END + ELSE BEGIN + this_address := first_address; + END {IF}; + this_address^.next := NIL; + + this_address^.address := (hex_char (line [2]) * 4096) + + (hex_char (line [3]) * 256) + + (hex_char (line [4]) * 16) + + hex_char (line [5]); + + FOR i := 1 TO 15 DO BEGIN + this_address^.name [i] := line [22 + i]; + END {FOR}; + + END {WHILE}; + + WHILE NOT EOF (map) DO BEGIN + READLN (map, line_no_part); + IF line_no_part = 'Line numbers for ' THEN BEGIN + line_nos_avail := TRUE; + BREAK; + END {IF}; + END {WHILE}; + + END {IF}; + + read (bucket, clock_grain, bucket_num, bucket_size, + prog_low_pa, prog_high_pa, dos_pa, hit_io, hit_dos, hit_high); + + NEW (buckets,ORD (bucket_num)); + + norm := 0.0; + norm_bucket := 0.0; + + FOR i := 1 TO ORD (bucket_num) DO BEGIN + read (bucket, this_bucket); + real_bucket := realword (this_bucket); + + IF real_bucket > norm_bucket THEN BEGIN + norm_bucket := real_bucket; + END {IF}; + + norm := norm + real_bucket; + buckets^[i] := real_bucket; + END {FOR}; + norm_bucket := 45.0/norm_bucket; + norm := 100.0/norm; + + WRITELN (hist, 'Microsoft Profiler Output Listing'); + + WRITELN (hist); + WRITELN (hist, ORD (bucket_num):6, bucket_size:4,'-byte buckets.'); + + WRITELN (hist); + WRITELN (hist, 'Profile taken between ', prog_low_pa*16::16, + ' and ', prog_high_pa*16::16, '.'); + + WRITELN (hist); + WRITELN (hist, 'DOS program address:', dos_pa::16); + + WRITELN (hist); + WRITELN (hist, 'Number of hits in DOS: ', hit_dos:5, + ' or ', realword (hit_dos) * norm:4:1, '%.'); + WRITELN (hist, 'Number of hits in I/O: ', hit_io:5, + ' or ', realword (hit_io) * norm:4:1, '%.'); + WRITELN (hist, 'Number of hits high : ', hit_high:5, + ' or ', realword (hit_high) * norm:4:1, '%.'); + WRITELN (hist); + WRITELN (hist, ' Hits Addr. Line/ Cumul. % 0.0 ', + ' ', + 1.0/norm:1:1); + + WRITELN (hist, ' Offset +----------------', + '----------------------------'); + WRITELN (hist, name); + i := 0; + parcel := 0; + current_base := 0; + line_no := 0; + new_line_no := 0; + cum_per_cent := 0.0; + + WHILE i < ORD (bucket_num) DO BEGIN + i := i + 1; + IF buckets^[i] < 0.9 THEN BEGIN + WRITELN (hist); + REPEAT + i := i + 1; + UNTIL (i = ORD (bucket_num)) OR ELSE buckets^[i] > 0.0; + END {IF}; + + address := bucket_size * (WRD (i) - 1); + + WHILE map_avail AND THEN + address >= first_address^.address DO BEGIN + WRITELN (hist, ' ', first_address^.name); + current_base := first_address^.address; + first_address := first_address^.next; + END {WHILE}; + + WHILE line_nos_avail AND THEN NOT eof (map) AND THEN + address >= parcel DO BEGIN + skip_spaces; + WHILE (map^ < '0') OR (map^ > '9') DO BEGIN + + IF EOF (map) THEN BEGIN + goto 1; + END {IF}; + READLN (map); + skip_spaces; + END {WHILE}; + + + line_no := new_line_no; + new_line_no := read_word; + seg := read_hex (4); + IF EOF (map) THEN BEGIN + GOTO 1; + END {IF}; + IF map^ <> ':' THEN BEGIN + WRITELN ('Invalid map file'); + END {IF}; + get (map); + IF EOF (map) THEN BEGIN + GOTO 1; + END {IF}; + offset := read_hex (3) + WRD (hex_char (map^) > 0); + get (map); + IF map^ <> 'H' THEN BEGIN + WRITELN ('Invalid map file'); + END {IF}; + IF EOF (map) THEN BEGIN + GOTO 1; + END {IF}; + get (map); + parcel := seg + offset; + END {WHILE}; +1: real_per_cent := buckets^[i] * norm; + cum_per_cent := cum_per_cent + real_per_cent; + per_cent := ROUND ( buckets^[i] * norm_bucket); + + WRITE (hist, buckets^ [i]:6:0, ' ', + address*16:6:16); + IF line_no <> 0 THEN BEGIN + WRITE (hist, line_no:6); + line_no := 0; + END + ELSE IF map_avail AND THEN first_address <> NIL THEN BEGIN + WRITE (hist, ' #', address - first_address^.address:4:16); + END + ELSE BEGIN + WRITE (hist, ' '); + END {IF}; + + WRITELN (hist, ' ', cum_per_cent:5:1, ' ', real_per_cent:4:1, ' |', + '*': per_cent); + END {WHILE}; + WRITELN (hist, ' +-----------------', + '------------------'); +END. + \ No newline at end of file diff --git a/v2.0/bin/QUICK.DOC b/v2.0/bin/QUICK.DOC new file mode 100644 index 0000000000000000000000000000000000000000..d443b8eda0e100b1bd49a11fcb821cc2407a4c70 GIT binary patch literal 3456 zcmbVOU60yE6zww-|KTdqs;oq4leZ>KB-WT&m%-qj&&b{6`a)b4B84d^hH}itwfVxi@7lL9B09=?PxW5d_qwiRxua*l!|K~-BuhRfEx!uNq{!3ZAaK{ym1|%09$Saz z{QJXrs~+IR4W{A6r+uhLndelhBh~S}phH~mHIj6f7p+EjoBwAta97_O?elQ_&E2I_ zQe}R6j8XSNZl>=qr-vM-(Zx82gUI`*s(x_Kn!G`eYE7%~`OFXLK~!3*lFFvoifTCc z;4cA&PwA`AHvH}d_wqsI4KU)(NM)2(@G`L zScA?!E_Z-Z(o~fw>qmH<*lK6i*tLdX*}m^xP_0b$Ch#@0$33Vz+^lXdgt20X#Mb+8 zu)1s|SY5CZhyw709czdS(lO>lR5ThC+6ofIp+0p$wb6oUGy$v1lqM5YEw~)R=8xHr zT0=)w-81p5Q#Ojm{J1YSfjhk=^4El0{(Np@iJGd^z~?V2%ji#slD$aona5dECN<+E zl^VUo?~D~U@aA{_Y6lRL*@@z;78M;US%b@)X|w<`UULK^2FL5`$z*bdxlq)UsG{Jq zXvj^nZ#zx2!R=OiN=0$C10DgPgF&^;gu&XwtAAQ!h z*SQ^AUX_<8^o$~SA%#1TLzKL*@2%-Rd=mwHD)txy5h6xX^o%|AT4~=uCMI=fK%~8( zsw#y;eGrL+tfoM}`_YT++c}Eb)lQT9(RJ|D$T~2pn=Smu`hHB5#EoV_uSAW$+xK1C zvV2hYqGEDI(H*7Y!CvVZ+?BLWfe`~?(simDWXDYI8_0#^oA&)<@N8Bl0#1g5n`z`M zXywmb3ZwUoOJwFO{4=OBUJ9XgygM`Imhl!H#Szjw94efXNcM^;fiU_ga#;#J=4%El zHW==4XB5~+1^``LrGz{VO^wjr`H@d~ycM~9S%Xq%jOZYuVtV+Yb2s z`*7jS&w3T^W!65}8asX8(Uz-UiE^cDbn5EG^S4*O@|TzR@?vbm0BeX!abzao=(pj( zo71PYAAP2g8w7r^bU(ODD!%~;UKoY+4f*kuenD^EbYEXy_rY4bUS_gLRGCVX7I0Ws zjTlqfk)kChsx$Wky2{C0(`W?PUvq^snG5dmHO>6*jfdi|2BdA`9D{HxL2)*~@a~+p zyl3vWbrmGJ4-RiF{j%cZkOc(AwGNX?2)rJd(aKYZrt8pa@t~@j34qQz{@T7rccHe- zopvF@>1s7y&&*bS+r_ro?L;*;>k3C0mrxQd z3MO1ftl=QMJMW7+@S4bdQ3p}QCR%;cwI~o3^6F|BxQ_p1F$o0F))of^FxSk#v(+=J zRMBFD=F`Y1j*VIaRN^aKZ)2Vrysx4T&?0Dn!6U{_;H}TP%6ZB%iwmyBHcsw$l|t9d zZ7x3+B~xk;JC_*Ubll72Y>&y5$~B!-!`N*#PL^g8_v;lj7Bf>p^$St&*_fRl?#L9;HUSTVNz8j3#mKH6(@`2|T&@N=6cPa+mEOm2dGm7oQx zgm^H@(6kZ*nPGwAn$HAIyO$=5){+4{f?E2{)6Em`GUAT$0C@BKYo)?$TVvu;@-!Sa z`a^FcQxys6y@n%@bMC#HJi*emopN#Bw#1YlvmYxyYKq)=oHE)?Ku2hmKm*TGGbPt( z8^nPD*})K6wp9wM0JotZL}PNi&B6`FG=CSkn=xik;M$PqGRNwoX;jDgJu}l;1YWo? RbxuVc%UnZAe)?~pzX3eE-pT*~ literal 0 HcmV?d00001 diff --git a/v2.0/bin/README.DOC b/v2.0/bin/README.DOC new file mode 100644 index 0000000..c5bbf25 --- /dev/null +++ b/v2.0/bin/README.DOC @@ -0,0 +1,177 @@ + MSDOS 2.0 RELEASE + + +The 2.0 Release of MSDOS includes five 5 1/4 double density single sided +diskettes or three 8 iinch CP/M 80 format diskettes. + +The software/documentation on the five inch diskettes is arranged +as follows: + +1. DOS distribution diskette. This diskette contains files which + should be distriibuted to all users. This allows the DOS distri- + bution diskette to meet the requirements of users of high level + language compilers as well as users running only applications. + Many compilers marketed independently through the retail channel + (including those of Microsoft) assume LINK comes with the DOS, as + in the case of IBM. How you choose to distrubute BASIC (contracted + for separately) is up to you. + +2. Assembly Language Development System diskette. This diskette + contains files of interest to assembly language programmers. + High level language programmers do not need these programs unless + they are writing assembly language subroutines. IBM chose to + unbundle this package from the DOS distribution diskette (except + for DEBUG), but you do not have to do so. + +3. PRINT and FORMAT diskette. This diskette contains .ASM source + files which are necessary to assemble the print spooler, which you + may wish to customize for greater performance. .OBJ files are also + included for the FORMAT utility. + +4. Skeltal BIOS and documentation diskette. This diskette contains + the skeltal BIOS source code and the SYSINIT and SYSIMES object + modules which must be linked with your BIOS module. The proper + sequence for linking is BIOS - SYSINIT - SYSIMES. + A profiler utiliity is also included on the diskette, but this + is not intended for end-users. This is distributed for use by + your development staff only and is not supported by Microsoft + If you do decide to distribute it, it is at your own risk! + + +5. Documentation. Features of 2.0 are documented on this disk. + +The user manual contains some significant errors. Most of these are +due to last minute changes to achieve a greater degree of compatibility +with IBM's implementation of MS-DOS (PC DOS). This includes the use +of "\" instead of "/" as the path separator, and "/" instead of "-" +as the switch character. For transporting of batch files across +machines, Microsoft encourages the use of "\" and "/" respectively +in the U.S. market. (See DOSPATCH.TXT for how you can overide this. +The user guide explains how the end-user can override this in CONFIG.SYS). +Both the printer echo keys and insert mode keys have now been made to +toggle. The default prompt (this may also be changed by the user +with the PROMPT command) has been changed from "A:" to "A>". +We apologize for any inconveniences these changes may have caused +your technical publications staff. + + +Here is what you need to do to MSDOS 2.0 to create a shipable product: +(see "Making a Bootable Diskette" below) + +1. BIOS. If you have developed a BIOS for the Beta Test 2.0 version + You should link your BIOS module to SYSINIT.OBJ and SYSIMES.OBJ. + You must modify your BIOS to accomodate the call back to the BIOS + at the end of SYSINIT. If you have no need for this call, simply + find a far RET and label it RE_INIT and declare it public. + An example of this can be found in the skeletal BIOS. In addition + please add support for the new fast console output routine as + described in the device drivers document. We strongly recommend + that you adapt the standard boot sector format also described in + device drivers. Once again, please refer to the skeletal BIOS. + If you have not yet implemented version 2.0 please read the device + drivers document. Microsoft strongly recommends that machines + incorporating integrated display devices with memory mapped video + RAM implement some sort of terminal emulations through the use of + escape sequences. The skeletal BIOS includes a sample ANSI + terminal driver. + +2. Please refer to DOSPATCH.TXT for possible changes you might wish + to make. We strongly recommend that you not patch the switch + characters for the U.S. market. Your one byte serial number + will be issued upon signing the license agreement. Please patch + the DOS accordingly. If you wish to serialize the DOS, this is + described in DOSPATCH.TXT. Please patch the editing template + definitions. Please note the addition of the Control-Z entry + at the beginning of the table. Also note that the insert switches + have now both been made to toggle. + +3. Utilities. FORMAT must be configured for each specific system. + GENFOR is a generic example of a system independent format module, + but it is not recommended that this be distributed to your customers. + Link in the following order: FORMAT, FORMES, (your format module). + The print spooler is distributed as an executable file, which only + prints during wait for keyboard input. If you wish with your + implementation to steal some compute time when printing as well, + you will need to customize it and reassemble. Please note that + you can use a printer-ready or timer interrupt. The former is more + efficient, but ties the user to a specific device. Sample code + is conditionaled out for the IBM PC timer interrupt. + +The following problems are known to exist: + +1. Macro assembler does not support the initialization of 10-byte + floating point constants in 8087 emulation mode - the last two bytes + are zero filled. + +2. LIB has not been provided. The version which incorporates support + for 2.0 path names will be completed in a couple of weeks. The + 1.x version should work fine if you cannot wait. Because the library + manager acts as a counterpart to the linker, we recommend that it + be distributed with the DOS distribution diskette as opposed to the + assembly language development system. + +3. International (French, German, Japanese, and U.K.) versions will be + available in several months. + +4. COMMAND.ASM is currently too large to assemble on a micro. It is + being broken down into separate modules so it can be asembled on + a machine. Source licensees should realize that the resultant + binaries from the new version will not correspond exactly to the + old version. + +5. If you have any further questions regarding the MSDOS 2.0 distribution + please contact Don Immerwahr (OEM technical support (206) 828-8086). + + + Sincerely yours, + + + Chris Larson + MS-DOS Product Marketing Manager + (206) 828-8080 + + + + BUILDING A BOOTABLE (MSDOS FORMAT) DISKETTE + + +1. In implementing MSDOS on a new machine, it is highly recommended + that an MSDOS machine be available for the development. + Please note that utilities shipped with MSDOS 2.0 use MSDOS 2.0 + system calls and WILL NOT not run under MSDOS 1.25. + +2. Use your MSDOS development machine and EDLIN or a word processor + package to write BOOT.ASM, your bootstrap loader BIOS.ASM and + your Format module. + +3. Use MASM, the Microsoft Macro-86 Assembler, to assemble these + modules. LINK is then used to link together the .OBJ modules in + the order specified. + +4. Link creates .EXE format files which are not memory image files + and contain relocation information in their headers. Since your + BIOS and BOOT routines will not be loaded by the EXE loader in + MSDOS, they must first be turned into memory image files by + using the EXE2BIN utility. + +5. The easiest thing to do is to (using your development machine) + FORMAT a single sided diskette without the system. Use DEBUG + to load and write your BOOT.COM bootstrap loader to the BOOT + sector of that diskette. You may decide to have your bootstrap + load BIOS and let the BIOS load MSDOS or it may load both. Note that + the Bootstrap loader will have to know physically where to go on + the disk to get the BIOS and the DOS. COMMAND.COM is loaded + by the SYSINIT module. + +6. Use the COPY command to copy your IO.SYS file (what the + BIOS-SYSINIT-SYSIMES module is usually called) onto the disk + followed by MSDOS.SYS and COMMAND.COM. You may use DEBUG + to change the directory attribute bytes to make these files hidden. + +CAUTION: + +At all times, the BIOS writer should be careful to preserve the state +of the DOS - including the flags. You should be also be cautioned that +the MSDOS stack is not deep. You should not count on more than one or +two pushes of the registers. + \ No newline at end of file diff --git a/v2.0/bin/RECOVER.COM b/v2.0/bin/RECOVER.COM new file mode 100644 index 0000000000000000000000000000000000000000..fa51faefa80a6f6e4f6807e2982902587c11de9d GIT binary patch literal 2277 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 literal 0 HcmV?d00001 diff --git a/v2.0/bin/SYS.COM b/v2.0/bin/SYS.COM new file mode 100644 index 0000000000000000000000000000000000000000..2d315d7320baa764d85dac6852f065ddc4754783 GIT binary patch literal 850 zcmbu7Pe>F|9LJyYwm)u}b;wAu-U~?yGflL}zd`UasFmG_jO{S)K55XMS>BAhtfxH{ z}0pAcJneh>;p(4pwEvM6|vJp|dCG3yc(^n-yP-yh%4_xGEbYW+RR zY}C_rrDvRXOZ@orP=6geFa)&Bkz;4Y9OU&9OLV__PP~E}-+*`qH+I0nrWP74e1f7B z%$E-zmH2WgKl~7&*$;!e&d2<48~|sHpO*N0sj#VCJs1a0dH$VpEop_K_WGs9iNvC) z@d1f>quA0U4wq(&0zuvww9k37h~AZWxehEsxY!3*x3m?IuRH-F8sg0ouOhet#w%H{ z5C?^JSlH1D6Ho;dwS8=}$OA<`A)+uqw#+xh0q>W%_T{OfRia?FPf;qjK=z`_@})_i z?rRf3jD-B-#Zs`NM0;;S?80hAoDWsM@^)`sVmH$5krtP9dZg7QU1i?rtLl{Z9y!&! z2H)JQZI64TTQ$9Fwe1H3Z_EDj-a2oRxVPkz4wqaQb;(KI;YHL37_4(%c%;)MEgtD| zNh?1taT#2@1cC?rU+o6=Ltrd|f{IPV{sP>0+>YId#FXb>9cRGE@A_lLn3=E`qX`H3 z>RA!b=AG-a`UhNbM(b__F!43H`% fVWrYan4D27?Pb}<9Bqs3^$ycbdy1-al5IZ#Kl%$e literal 0 HcmV?d00001 diff --git a/v2.0/bin/SYSCALL.DOC b/v2.0/bin/SYSCALL.DOC new file mode 100644 index 0000000..26d4729 --- /dev/null +++ b/v2.0/bin/SYSCALL.DOC @@ -0,0 +1,1657 @@ + + + + + + + + + + + + + + + + + + + MS-DOS 2.0 + + System Calls Reference + + + + + + + + + + + + ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ +| | +| C A V E A T P R O G R A M M E R | +| | +| Certain structures, constants and system calls below | +| are private to the DOS and are extremely | +| version-dependent. They may change at any time at the | +| implementors' whim. As a result, they must not be | +| documented to the general public. If an extreme case | +| arises, they must be documented with this warning. | +| | +| Those structures and constants that are subject to the | +| above will be marked and bracketed with the flag: | +| | +| C A V E A T P R O G R A M M E R | +| | ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + + + + + + + + + + + + + + + + + + + Section 1 + + Extensions to existing call structure + + + Name: * Alloc - allocate memory + + Assembler usage: + MOV BX,size + MOV AH,Alloc + INT 21h + ; AX:0 is pointer to allocated memory + ; if alloc fails, BX is the largest block available + + Description: + Alloc returns a pointer to a free block of memory + that has the requested size in paragraphs. + + Error return: + AX = error_not_enough_memory + The largest available free block is smaller + than that requested or there is no free block. + = error_arena_trashed + The internal consistency of the memory arena + has been destroyed. This is due to a user + program changing memory that does not belong + to it. + + + Name: * CharOper - change incompatible configuration + parameters + + Assembler usage: + MOV AH, CharOper + MOV AL, func + MOV DL, data + INT 21h + ; on read functions, data is returned in DL + + Description: + CharOper allows a program to change system + parameters to allow for switch indicators and whether + devices are available at every level of the directory + tree. + + A function code is passed in AL: + + AL Function + -- -------- + 0 DL, on return, will contain the DOS switch + character. On most systems this will default to + '-'. + 1 Set the switch character to the character in DL. + 2 Read the device availability byte into DL. If + this byte is 0, then devices must be accessed in + file I/O calls by /dev/device. If this byte is + non-zero, then the devices are available at every + node of the directory tree (i.e. CON is the + console device not the file CON). This byte is + generally 0. + 3 Set the device availability byte to the value in + DL. + + Error returns: + AL = FF + The function code specified in AL is not in + the range 0:3 + + + Name: * CurrentDir - return text of current directory + + Assembler usage: + MOV AH,CurrentDir + LDS SI,area + MOV DL,drive + INT 21h + ; DS:SI is a pointer to 64 byte area that contains + ; drive current directory. + + Description: + CurrentDir returns the current directory for a + particular drive. The directory is root-relative and + does not contain the drive specifier. The drive code + passed in DL is 0=default, 1=A, 2=B, etc. + + Error returns: + AX = error_invalid_drive + The drive specified in DL was invalid. + + + Name: * Dealloc - free allocated memory + + Assembler usage: + MOV ES,block + MOV AH,dealloc + INT 21h + + Description: + Dealloc returns a piece of memory to the system + pool that was allocated by alloc. + + Error return: + AX = error_invalid_block + The block passed in ES is not one allocated + via Alloc. + = error_arena_trashed + The internal consistency of the memory arena + has been destroyed. This is due to a user + program changing memory that does not belong + to it. + + + Name: * FileTimes - get/set the write times of a + handle + + Assembler usage: + MOV AH, FileTimes + MOV AL, func + MOV BX, handle + ; if AL = 1 then then next two are mandatory + MOV CX, time + MOV DX, date + INT 21h + ; if AL = 0 then CX/DX has the last write time/date + ; for the handle. + + Description: + FileTimes returns or sets the last-write time for + a handle. These times are not recorded until the file + is closed. + + A function code is passed in AL: + + AL Function + -- -------- + 0 Return the time/date of the handle in CX/DX + 1 Set the time/date of the handle to CX/DX + + Error returns: + AX = error_invalid_function + The function passed in AL was not in the range + 0:1. + = error_invalid_handle + The handle passed in BX was not currently + open. + + + Name: * FindFirst - find matching file + + Assembler usage: + MOV AH, FindFirst + LDS DX, pathname + MOV CX, attr + INT 21h + ; DMA address has datablock + + Description: + FindFirst takes a pathname with wildcards in the + last component (passed in DS:DX), a set of attributes + (passed in CX) and attempts to find all files that + match the pathname and have a subset of the required + attributes. A datablock at the current DMA is written + that contains information in the following form: + + find_buf STRUC ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ +| C A V E A T P R O G R A M M E R | +| | + find_buf_sattr DB ? ; attribute of search + find_buf_drive DB ? ; drive of search + find_buf_name DB 11 DUP (?); search name + find_buf_LastEnt DW ? ; LastEnt + find_buf_ThisDPB DD ? ; This DPB + find_buf_DirStart DW ? ; DirStart +| | +| C A V E A T P R O G R A M M E R | ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + + find_buf_attr DB ? ; attribute found + find_buf_time DW ? ; time + find_buf_date DW ? ; date + find_buf_size_l DW ? ; low(size) + find_buf_size_h DW ? ; high(size) + find_buf_pname DB 13 DUP (?) ; packed name + find_buf ENDS + + To obtain the subsequent matches of the pathname, + see the description of FindNext + + Error Returns: + AX = error_file_not_found + The path specified in DS:DX was an invalid + path. + = error_no_more_files + There were no files matching this + specification. + + + Name: * FindNext - step through a directory matching + files + + Assembler usage: + ; DMA points at area returned by find_first + MOV AH, findnext + INT 21h + ; next entry is at dma + + Description: + FindNext finds the next matching entry in a + directory. The current DMA address must point at a + block returned by FindFirst (see FindFirst). + + Error Returns: + AX = error_no_more_files + There are no more files matching this pattern. + + + Name: * GetDMA - get current DMA transfer address + + Assembler usage: + MOV AH,GetDMA + INT 21h + ; ES:BX has current DMA transfer address + + Description: + Return DMA transfer address. + + Error returns: + None. + ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ +| C A V E A T P R O G R A M M E R | +| | + + Name: * GetDSKPT(DL) - get pointer to drive parameter + block + + Assembler usage: + MOV AH,GetDSKPT + INT 21h + ; DS:BX has address of drive parameter block + + Description: + Return pointer to default drive parameter block. + + Error returns: + None. + + Assembler usage: + MOV DL,DrvNUM + MOV AH,GetDSKPTDL + INT 21h + ; DS:BX has address of drive parameter block + + Description: + Return pointer to drive parameter block for drive + designated in DL (0=Default, A=1, B=2 ...) + + Error returns: + AL = FF + The drive given in DL is invalid. +| | +| C A V E A T P R O G R A M M E R | ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + + + Name: * GetFreespace - get Disk free space + + Assembler usage: + MOV AH,GetFreespace + MOV DL,Drive ;0 = default, A = 1 + INT 21h + ; BX = Number of free allocation units on drive + ; DX = Total number of allocation units on drive + ; CX = Bytes per sector + ; AX = Sectors per allocation unit + + Description: + Return Free space on disk along with additional + information about the disk. + + Error returns: + AX = FFFF + The drive number given in DL was invalid. + + NOTE: This call returns the same information in the same + registers (except for the FAT pointer) as the get FAT + pointer calls did in previous versions of the DOS. + + + Name: * GetInDOSF - get DOS critical-section flag + + Assembler usage: + MOV AH,GetInDOSF + INT 21h + ; ES:BX has location of the flag + MOV CritSEG, ES + MOV CritOFF, BX + ... + IntVec: + MOV AX, DWORD PTR Crit + CMP AX,0 + JZ DoFunc + IRET + DoFunc: ... + + Description: + Return location of indos flag. On return ES:BX is + the address of a byte memory cell inside the DOS. If + used in an interrupt service routine, it indicates + whether or not the DOS was interrupted in a critical + section. If the cell was zero, then the DOS was not + in a critical section and thus can be called by the + interrupt routine. If the cell was non-zero, the DOS + should be considered to be in an uninterruptable state + and for reliability, no DOS calls should be given. + + Error returns: + None. + + + Name: * GetVector - get interrupt vector + + Assembler usage: + MOV AH,GetVector + MOV AL,interrupt + INT 21h + ; ES:BX now has long pointer to interrupt routine + + Description: + Return interrupt vector associated with an + interrupt. + + Error returns: + None. + + + Name: * GetVerifyFlag - return current setting of the + verify after write flag. + + Assembler usage: + MOV AH,GetVerifyFlag + INT 21h + ; AL is the current verify flag value + + Description: + The current value of the verify flag is returned + in AL. + + Error returns: + None. + + + Name: * GetVersion - get DOS version number + + Assembler usage: + MOV AH,GetVersion + INT 21h + ; AL is the major version number + ; AH is the minor version number + ; BH is the OEM number + ; BL:CX is the (24 bit) user number + + Description: + Return MS-DOS version number. On return AL.AH + will be the two part version designation, ie. for + MS-DOS 1.28 AL would be 1 and AH would be 28. For pre + 1.28 DOS AL = 0. Note that version 1.1 is the same as + 1.10, not the same as 1.01. + + Error returns: + None. + + + Name: * International - return country dependent + information + + Assembler usage: + LDS DX, blk + MOV AH, International + MOV AL, func + INT 21h + + Description: + This call returns in the block of memory pointed + to by DS:DX, the following information pertinent to + international applications: + + +---------------------------+ + | WORD Date/time format | + +---------------------------+ + | BYTE ASCIZ string | + | currency symbol | + +---------------------------+ + | BYTE ASCIZ string | + | thousands separator | + +---------------------------+ + | BYTE ASCIZ string decimal | + | separator | + +---------------------------+ + + The date/time format has the following values and + meanings: + + 0 - USA standard h:m:s m/d/y + 1 - Europe standard h:m:s d/m/y + 2 - Japan standard y/m/d h:m:s + + The value passed in AL is either 0 (for current + country) or a country code (to be defined later. + Currently the country code must be zero). + + Error returns: + AX = error_invalid_function + The function passed in AL was not 0 + (currently). + + + Name: * KeepProcess - terminate process and remain + resident + + Assembler usage: + MOV AL, exitcode + MOV DX, parasize + MOV AH, KeepProcess + INT 21h + + Description: + This call terminates the current process and + attempts to set the initial allocation block to a + specific size in paragraphs. It will not free up any + other allocation blocks belonging to that process. + The exit code passed in AX is retrievable by the + parent via Wait. + + Error Returns: + None. + + + Name: * Rename - move a directory entry + + Assembler usage: + LDS DX, source + LES DI, dest + MOV AH, Rename + INT 21h + + Description: + Rename will attempt to rename a file into another + path. The paths must be on the same device. + + Error returns: + AX = error_file_not_found + The file name specifed by DS:DX was not found. + = error_not_same_device + The source and destination are on different + drives. + = error_access_denied + The path specified in DS:DX was a directory or + the file specified by ES:DI exists or the + destination directory entry could not be + created. + + + Name: * SetBlock - modify allocated blocks + + Assembler usage: + MOV ES,block + MOV BX,newsize + MOV AH,setblock + INT 21h + ; if setblock fails for growing, BX will have the + ; maximum size possible + + Description: + Setblock will attempt to grow/shrink an allocated + block of memory. + + Error return: + AX = error_invalid_block + The block passed in ES is not one allocated + via Alloc. + = error_arena_trashed + The internal consistency of the memory arena + has been destroyed. This is due to a user + program changing memory that does not belong + to it. + = error_not_enough_memory + There was not enough free memory after the + specified block to satisfy the grow request. + + + Name: * SetCtrlCTrapping - turn on/off broad ^C + checking + + Assembler usage: + MOV DL,val + MOV AH,SetCtrlCTrapping + MOV AL,func + INT 21h + ; If AL was 0, then DL has the current value of the + ; ^C check + + Description: + MSDOS ordinarily checks for a ^C on the + controlling device only when doing a function 1-12 + operation to that device. SetCtrlCTrapping allows the + user to expand this checking to include any system + call. For example, with the ^C trapping off, all disk + I/O will proceed without interruption while with ^C + trapping on, the ^C interrupt is given at the system + call that initiates the disk operation. + + Error return: + AL = FF + The function passed in AL was not in the range + 0:1. + ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ +| C A V E A T P R O G R A M M E R | +| | + + Name: * Set_OEM_Handler - set handler for OEM + specific INT 21H calls. + + Assembler usage: + LDS DX,handler_address + MOV AH,Set_OEM_Handler + INT 21H + + Description: + Set handler address for 0F9H-0FFH INT 21H system + calls to DS:DX. To return the 0F9H-0FFH calls to + the uninitialized state, give DS=DX=-1. + + Error returns: + None. + + Handler entry: + All registers as user set them when INT 21H + issued (including SS:SP). INT 21 return is on + stack, so the correct method for the OEM handler + to return to the user is to give an IRET. The + OEM handler is free to make any INT 21H system + call (including the 0F9H- 0FFH group if the OEM + handler is re-entrant). + + + The AH INT 21H function codes 0F8H through 0FFH are + reserved for OEM extensions to the INT 21H calling + convention. These calls have two states, initialized + and uninitialized. There will be one handler for all 7 + (0F9-0FFH) functions. When the DOS is first + initialized, these calls are uninitialized. The AH=0F8H + call is the call which will set the handler address for + the 0F9-0FFH calls. If the 0F9-0FFH calls are + uninitialized, an attempt to call them results in the + normal invalid system call number return. + OEMs should NOT document the 0F8 call. +| | +| C A V E A T P R O G R A M M E R | ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + + + + + + + + + + + + + + + + + + + Section 2 + + XENIX-compatible system calls + + + + Previous to version 2.0, MSDOS had a simple single + directory structure that sufficed for small (160k to 320K) + diskettes. As the need for hard disk support grows, and + as MSDOS 2.0 will support a wide variety of hard disks, + the need for better disk organization also grows. Merely + expanding the directory is not an effective solution; + doing a 'DIR' on a directory with 1000 files is not a + user-friendly characteristic. + + People, by nature, think in hierarchical terms: + organization charts and family trees, for example. It + would be nice to allow users to organize their files on + disk in a similar manner. Consider the following: + + In a particular business, both sales and accounting + share a computer with a large disk and the individual + employees use it for preparation of reports and + maintaining accounting information. One would naturally + view the organization of files on the disk in this + fashion: + + +-disk-+ + / \ + / \ + / \ + sales accounting + / | | \ + / | | \ + / | | \ + John Mary Steve Sue + / | (A) | | | \ + / | | | | \ + / | | | | \ + report accts. report accts. report report + receiv. receiv + + In MSDOS 2.0 the user can arrange his files in such a + manner that files that are not part of his current task do + not interfere with that task. Pre-2.0 versions of MSDOS + has a single directory that contains files. MSDOS extends + this concept to allow a directory to contain both files + and directories and to introduce the notion of the + 'current' directory. + + To specify a filename, the user could use one of two + methods, either specify a path from the root node to the + file, or specify a path from the current node to the file. + A path is a series of directory names separated by '/' and + ending with a filename. A path that starts at the root + begins with a '/'. + + There is a special directory entry in each directory, + denoted by '..' that is the parent of the directory. The + root directory's parent is itself (who created God?). + + Using a directory structure like the hierarchy above, + and assuming that the current directory is at point (D), + to reference the report under John, the following are all + equivalent: + + report + /sales/John/report + ../John/report + + To refer to the report under Mary, the following are + all equivalent: + + ../Mary/report + /sales/Mary/report + + To refer to the report under Sue, the following are + all equivalent. + + ../../accounting/Sue/report + /accounting/Sue/report + + There is no restriction in MSDOS 2.0 on the depth of a + tree (the length of the longest path from root to leaf) + except in the number of allocation units available. The + root directory will have a fixed number of entries, 64 for + the single sided diskettes to XXX for a large hard disk. + For non-root directories, there is no limit to the number + of files per directory excepting in the number of + allocation units available. + + Old (pre-2.0) disks will appear to MSDOS 2.0 as having + only a root directory with files in it and no + subdirectories whatever. + + Implementation of the tree-structure is simple. The + root directory is the pre-2.0 directory. Subdirectories + of the root have a special attribute set indicating that + they are directories. The subdirectories themselves are + files, linked through the FAT as usual. Their contents + are identical in character to the contents of the root + directory. + + Pre-2.0 programs that use system calls not described + below will not be able to make use of files in other + directories. They will only be able to access files in + the current directory. This is no great loss of + functionality as users will aggregate their files into + sub-directories on basis of functionality; the files that + are being used will be found in the current directory. + Those that are not necessary for the current task will be + placed in other directories. Out of sight, out of mind. + + There are also new attributes in 2.0. These and the + old attributes apply to the tree structured directories in + the following manner: + + Attribute Meaning/Function Meaning/Function + for files for directories + + volume_id Present at the root. Meaningless. + Only one file may have + this set. + + directory Meaningless. Indicates that the + directory entry is a + directory. Cannot be + changed with ChMod. + + read_only Old fcb-create, new Meaningless. + Creat, new open (for + write or read/write) + will fail. + + archive Set when file is Meaningless. + written. Set/reset via + ChMod. + + hidden/ Prevents file from Prevents directory + system being found in search entry from being + first/search next. found. ChDir to + New open will fail. directory will still + work. + + + Name: * ChDir - Change the current directory + + Assembler usage: + LDS DX, name + MOV AH, ChDir + INT 21h + + Description: + ChDir is given the ASCIZ name of the directory + which is to become the current directory. If any + member of the specified pathname does not exist, then + the current directory is unchanged. Otherwise, the + current directory is set to the string. + + Error returns: + AX = error_path_not_found + The path specified in DS:DX either indicated a + file or the path was invalid. + + + Name: * ChMod - change write protection + + Assembler usage: + LDS DX, name + MOV CX, attribute + MOV AL, func + MOV AH, ChMod + INT 21h + + Description: + Given an ASCIZ name, ChMod will set/get the + attributes of the file to those given in CX. + + A function code is passed in AL: + + AL Function + -- -------- + 0 Return the attributes of the file in CX + 1 Set the attributes of the file to those in CX + + Error returns: + AX = error_path_not_found + The path specified was invalid. + = error_access_denied + The attributes specified in CX contained one + that could not be changed (directory, volume + ID). + = error_invalid_function + The function passed in AL was not in the range + 0:1. + + + Name: * Close - close a file handle + + Assembler usage: + MOV BX, handle + MOV AH, Close + INT 21h + + Description: + In BX is passed a file handle (like that returned + by Open, Creat or Dup); the Close call will close the + associated file. Internal buffers are flushed. + + Error return: + AX = error_invalid_handle + The handle passed in BX was not currently + open. + + + Name: * Creat - create a file + + Assembler usage: + LDS DX, name + MOV AH, Creat + MOV CX, attribute + INT 21h + ; AX now has the handle + + Description: + Creat creates a new file or truncates an old file + to zero length in preparation for writing. If the + file did not exist, then the file is created in the + appropriate directory and the file is given the + read/write protection code of access. + + CX contains the default attributes to be set for + the file. Currently, the read-only bit must be off. + + Error returns: + AX = error_access_denied + The attributes specified in CX contained one + that could not be created (directory, volume + ID), a file already existed with a more + inclusive set of attributes, or a directory + existed with the same name. + = error_path_not_found + The path specified was invalid. + = error_too_many_open_files + The file was created with the specified + attributes, but there were no free handles + available for the process or that the internal + system tables were full. + + + Name: * Dup - duplicate a file handle + + Assembler usage: + MOV BX, fh + MOV AH, Dup + INT 21h + ; AX has the returned handle + + Description: + Dup takes an already opened file handle and + returns a new handle that refers to the same file at + the same position. + + Error returns: + AX = error_invalid_handle + The handle passed in BX was not currently + open. + = error_too_many_open_files + There were no free handles available in the + current process or the internal system tables + were full. + + + Name: * Dup2 - force a duplicate of a handle + + Assembler usage: + MOV BX, fh + MOV CX, newfh + MOV AH, Dup2 + INT 21h + + Description: + Dup2 will cause newfh to refer to the same stream + as fh. If there was an open file on newfh, then it is + closed first. + + Error returns: + AX = error_invalid_handle + The handle passed in BX was not currently + open. + + + Name: * Exec - load / execute a program + + Assembler usage: + LDS DX, name + LES BX, blk + MOV AH, Exec + MOV AL, func + INT 21h + + Description: + This call allows a program to load another program + into memory and (default) begin execution of it. + DS:DX points to the ASCIZ name of the file to be + loaded. ES:BX points to a parameter block for the + load. + + A function code is passed in AL: + + AL Function + -- -------- + 0 Load and execute the program. A program header is + established for the program and the terminate and + ^C addresses are set to the instruction after the + EXEC system call. + + NOTE: When control is returned, via a ^C or + terminate, from the program being EXECed ALL + registers are altered including the stack. + This is because control is returned from the + EXECed program, not the system. To regain + your stack, store an SS:SP value in a data + location reachable from your CS. + ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ +| C A V E A T P R O G R A M M E R | +| | + 1 Load, create the program header but do not begin + execution. The CS:IP/SS:SP of the program are + returned in the area provided by the user. +| | +| C A V E A T P R O G R A M M E R | ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + + 3 Load, do not create the program header, and do not + begin execution. This is useful in loading + program overlays. + + For each value of AL, the block has the following + format: + + AL = 0 -> load/execute program + + +---------------------------+ + | WORD segment address of | + | environment. | + +---------------------------+ + | DWORD pointer to command | + | line at 80h | + +---------------------------+ + | DWORD pointer to default | + | FCB to be passed at 5Ch | + +---------------------------+ + | DWORD pointer to default | + | FCB to be passed at 6Ch | + +---------------------------+ + ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ +| C A V E A T P R O G R A M M E R | +| | + AL = 1 -> load program + + +---------------------------+ + | WORD segment address of | + | environment. | + +---------------------------+ + | DWORD pointer to command | + | line at 80h | + +---------------------------+ + | DWORD pointer to default | + | FCB to be passed at 5Ch | + +---------------------------+ + | DWORD pointer to default | + | FCB to be passed at 6Ch | + +---------------------------+ + | DWORD returned value of | + | SS:SP | + +---------------------------+ + | DWORD returned value of | + | CS:IP | + +---------------------------+ +| | +| C A V E A T P R O G R A M M E R | ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + + AL = 3 -> load overlay + + +---------------------------+ + | WORD segment address where| + | file will be loaded. | + +---------------------------+ + | WORD relocation factor to | + | be applied to the image. | + +---------------------------+ + + Note that all open files of a process are + duplicated in the child process after an Exec. This + is extremely powerful; the parent process has control + over the meanings of stdin, stdout, stderr, stdaux and + stdprn. The parent could, for example, write a series + of records to a file, open the file as standard input, + open a listing file as standard output and then Exec a + sort program that takes its input from stdin and + writes to stdout. + + Also inherited (or passed from the parent) is an + 'environment'. This is a block of text strings (less + than 32K bytes total) that convey various + configurations parameters. The format of the + environment is as follows: + + (paragraph boundary) + +---------------------------+ + | BYTE asciz string 1 | + +---------------------------+ + | BYTE asciz string 2 | + +---------------------------+ + | ... | + +---------------------------+ + | BYTE asciz string n | + +---------------------------+ + | BYTE of zero | + +---------------------------+ + + Typically the environment strings have the form: + + parameter=value + + for example, COMMAND.COM always passes its execution + search path as: + + PATH=A:/BIN;B:/BASIC/LIB + + A zero value of the environment address will cause the + child process to inherit the parent's environment + unchanged. + + Note that on a successful return from EXEC, all + registers, except for CS:IP, are changed. + + Error return: + AX = error_invalid_function + The function passed in AL was not 0, 1 or 3. + = error_bad_environment + The environment was larger than 32Kb. + = error_bad_format + The file pointed to by DS:DX was an EXE format + file and contained information that was + internally inconsistent. + = error_not_enough_memory + There was not enough memory for the process to + be created. + = error_file_not_found + The path specified was invalid or not found. + + + Name: * Exit - terminate a process + + Assembler usage: + MOV AL, code + MOV AH, Exit + INT 21h + + Description: + Exit will terminate the current process, + transferring control to the invoking process. In + addition, a return code may be sent. All files open + at the time are closed. + + Error returns: + None. + + + Name: * Ioctl - I/O control for devices + + Assembler usage: + MOV BX, Handle + + (or MOV BL, drive for calls AL=4,5 + 0=default,A=1...) + + MOV DX, Data + + (or LDS DX, buf and + MOV CX, count for calls AL=2,3,4,5) + + MOV AH, Ioctl + MOV AL, func + INT 21h + ; For calls AL=2,3,4,5 AX is the number of bytes + ; transferred (same as READ and WRITE). + ; For calls AL=6,7 AL is status returned, AL=0 if + ; status is not ready, AL=0FFH otherwise. + + Description: + Set or Get device information associated with open + Handle, or send/receive control string to device + Handle or device. + + The following values are allowed for func: + + Request Function + ------ -------- + 0 Get device information (returned in DX) + 1 Set device information (as determined by DX) + 2 Read CX number of bytes into DS:DX from device + control channel. + 3 Write CX number of bytes from DS:DX to device + control channel. + 4 Same as 2 only drive number in BL + 0=default,A=1,B=2,... + 5 Same as 3 only drive number in BL + 0=default,A=1,B=2,... + 6 Get input status + 7 Get output status + + Ioctl can be used to get information about device + channels. It is ok to make Ioctl calls on regular + files but only calls 0,6 and 7 are defined in that + case (AL=0,6,7), all other calls return an + error_invalid_function error. + + CALLS AL=0 and AL=1 + + The bits of DX are defined as follows for calls + AL=0 and AL=1. Note that the upper byte MUST be zero + on a set call. + + | + 15 14 13 12 11 10 9 8|7 6 5 4 3 2 1 0 + +--+--+--+--+--+--+-+-+-+-+-+-+-+-+-+-+ + | R| C| |I|E|R|S|I|I|I|I| + | e| T| |S|O|A|P|S|S|S|S| + | s| R| Reserved |D|F|W|E|C|N|C|C| + | | L| |E| | |C|L|U|O|I| + | | | |V| | |L|K|L|T|N| + +--+--+--+--+--+--+-+-+-+-+-+-+-+-+-+-+ + | + + ISDEV = 1 if this channel is a device + = 0 if this channel is a disk file (Bits 8-15 = + 0 in this case) + + If ISDEV = 1 + + EOF = 0 if End Of File on input + RAW = 1 if this device is in Raw mode + = 0 if this device is cooked + ISCLK = 1 if this device is the clock device + ISNUL = 1 if this device is the null device + ISCOT = 1 if this device is the console output + ISCIN = 1 if this device is the console input + SPECL = 1 if this device is special + + CTRL = 0 if this device can NOT do control strings + via calls AL=2 and AL=3. + CTRL = 1 if this device can process control + strings via calls AL=2 and AL=3. + NOTE that this bit cannot be set. + + If ISDEV = 0 + EOF = 0 if channel has been written + Bits 0-5 are the block device number for the + channel (0 = A, 1 = B, ...) + + Bits 15,8-13,4 are reserved and should not be altered. + + Calls 2..5: + These four calls allow arbitrary control strings to be + sent or received from a device. The Call syntax is + the same as the READ and WRITE calls, except for 4 and + 5 which take a drive number in BL instead of a handle + in BX. + + An error_invalid_function error is returned if the + CTRL bit (see above) is 0. + + An error_access_denied is returned by calls AL=4,5 if + the drive number is invalid. + + Calls 6,7: + These two calls allow the user to check if a file + handle is ready for input or output. Status of + handles open to a device is the intended use of these + calls, but status of a handle open to a disk file is + OK and is defined as follows: + + Input: + Always ready (AL=FF) until EOF reached, then + always not ready (AL=0) unless current + position changed via LSEEK. + Output: + Always ready (even if disk full). + + IMPORTANT NOTE: + The status is defined at the time the system is + CALLED. On future versions, by the time control is + returned to the user from the system, the status + returned may NOT correctly reflect the true current + state of the device or file. + + Error returns: + AX = error_invalid_handle + The handle passed in BX was not currently + open. + = error_invalid_function + The function passed in AL was not in the range + 0:7. + = error_invalid_data + = error_access_denied (calls AL=4..7) + + + Name: * LSeek - move file read/write pointer + + Assembler usage: + MOV DX, offsetlow + MOV CX, offsethigh + MOV AL, method + MOV BX, handle + MOV AH, LSeek + INT 21h + ; DX:AX has the new location of the pointer + + Description: + LSeek moves the read/write pointer according to + method: + + Method Function + ------ -------- + 0 The pointer is moved to offset bytes from the + beginning of the file. + 1 The pointer is moved to the current location + plus offset. + 2 The pointer is moved to the end of file plus + offset. + + Offset should be regarded as a 32-bit integer with + CX occupying the most significant 16 bits. + + Error returns: + AX = error_invalid_handle + The handle passed in BX was not currently + open. + = error_invalid_function + The function passed in AL was not in the range + 0:2. + + + Name: * MkDir - Create a directory entry + + Assembler usage: + LDS DX, name + MOV AH, MkDir + INT 21h + + Description: + Given a pointer to an ASCIZ name, create a new + directory entry at the end. + + Error returns: + AX = error_path_not_found + The path specified was invalid or not found. + = error_access_denied + The directory could not be created (no room in + parent directory), the directory/file already + existed or a device name was specified. + + + Name: * Open - access a file + + Assembler usage: + LDS DX, name + MOV AH, Open + MOV AL, access + INT 21h + ; AX has error or file handle + ; If successful open + + Description: + Open associates a 16-bit file handle with a file. + + The following values are allowed for access: + + ACCESS Function + ------ -------- + 0 file is opened for reading + 1 file is opened for writing + 2 file is opened for both reading and writing. + + DS:DX point to an ASCIZ name of the file to be + opened. + + The read/write pointer is set at the first byte of + the file and the record size of the file is 1 byte. + The returned file handle must be used for subsequent + I/O to the file. + + The DOS, on initialization, will have a maximum + number of files. See the configuration file document + for information on changing this default. + + Error returns: + AX = error_invalid_access + The access specified in AL was not in the + range 0:2. + = error_file_not_found + The path specified was invalid or not found. + = error_access_denied + The user attempted to open a directory or + volume-id, or open a read-only file for + writing. + = error_too_many_open_files + There were no free handles available in the + current process or the internal system tables + were full. + + + Name: * Read - Do file/device I/O + + Assembler usage: + LDS DX, buf + MOV CX, count + MOV BX, handle + MOV AH, Read + INT 21h + ; AX has number of bytes read + + Description: + Read transfers count bytes from a file into a + buffer location. It is not guaranteed that all count + bytes will be read; for example, reading from the + keyboard will read at most one line of text. If the + returned value is zero, then the program has tried to + read from the end of file. + + All I/O is done using normalized pointers; no + segment wraparound will occur. + + Error returns: + AX = error_invalid_handle + The handle passed in BX was not currently + open. + = error_access_denied + The handle passed in BX was opened in a mode + that did not allow reading. + + + Name: * RmDir - Remove a directory entry + + Assembler usage: + LDS DX, name + MOV AH, RmDir + INT 21h + + Description: + RmDir is given an asciz name of a directory. That + directory is removed from its parent + + Error returns: + AX = error_path_not_found + The path specified was invalid or not found. + = error_access_denied + The path specified was not empty, not a + directory, the root directory or contained + invalid information. + = error_current_directory + The path specified was the current directory + on a drive. + + + Name: * Unlink - delete a directory entry + + Assembler usage: + LDS DX, name + MOV AH, Unlink + INT 21h + + Description: + Unlink removes a directory entry associated with a + filename. If the file is currently open on another + handle, then no removal will take place. + + Error returns: + AX = error_file_not_found + The path specified was invalid or not found. + = error_access_denied + The path specified was a directory or + read-only. + + + Name: * Wait - retrieve the return code of a child + + Assembler usage: + MOV AH, Wait + INT 21h + ; AX has the exit code + + Description: + Wait will return the Exit code specified by a + child process. It will return this Exit code only + once. The low byte of this code is that sent by the + Exit routine. The high byte is one of the following: + + 0 - terminate/abort + 1 - ^C + 2 - Hard error + 3 - Terminate and stay resident + + Error returns: + None. + + + Name: * Write - write to a file + + Assembler usage: + LDS DX, buf + MOV CX, count + MOV BX, handle + MOV AH, Write + INT 21h + ; AX has number of bytes written + + Description: + Write transfers count bytes from a buffer into + a file. It should be regarded as an error if the + number of bytes written is not the same as the number + requested. + + It is important to note that the write system + call with a count of zero (CX = 0) will truncate + the file at the current position. + + All I/O is done using normalized pointers; no + segment wraparound will occur. + + Error Returns: + AX = error_invalid_handle + The handle passed in BX was not currently + open. + = error_access_denied + The handle was not opened in a mode that + allowed writing. + + +The following XENIX convention is followed for the new 2.0 +system calls: + + o If no error occurred, then the carry flag will be + reset and register AX will contain the appropriate + information. + + o If an error occurred, then the carry flag will be + set and register AX will contain the error code. + +The following code sample illustrates the recommended method +of detecting these errors: + + ... + MOV errno,0 + INT 21h + JNC continue + MOV errno,AX +continue: + ... + +The word variable errno will now have the correct error code +for that system call. + +The current equates for the error codes are: + +no_error_occurred EQU 0 + +error_invalid_function EQU 1 +error_file_not_found EQU 2 +error_path_not_found EQU 3 +error_too_many_open_files EQU 4 +error_access_denied EQU 5 +error_invalid_handle EQU 6 +error_arena_trashed EQU 7 +error_not_enough_memory EQU 8 +error_invalid_block EQU 9 +error_bad_environment EQU 10 +error_bad_format EQU 11 +error_invalid_access EQU 12 +error_invalid_data EQU 13 +error_invalid_drive EQU 15 +error_current_directory EQU 16 +error_not_same_device EQU 17 +error_no_more_files EQU 18 + + +System call assignments: + +ABORT EQU 0 ; 0 0 +STD_CON_INPUT EQU 1 ; 1 1 +STD_CON_OUTPUT EQU 2 ; 2 2 +STD_AUX_INPUT EQU 3 ; 3 3 +STD_AUX_OUTPUT EQU 4 ; 4 4 +STD_PRINTER_OUTPUT EQU 5 ; 5 5 +RAW_CON_IO EQU 6 ; 6 6 +RAW_CON_INPUT EQU 7 ; 7 7 +STD_CON_INPUT_NO_ECHO EQU 8 ; 8 8 +STD_CON_STRING_OUTPUT EQU 9 ; 9 9 +STD_CON_STRING_INPUT EQU 10 ; 10 A +STD_CON_INPUT_STATUS EQU 11 ; 11 B +STD_CON_INPUT_FLUSH EQU 12 ; 12 C +DISK_RESET EQU 13 ; 13 D +SET_DEFAULT_DRIVE EQU 14 ; 14 E +FCB_OPEN EQU 15 ; 15 F +FCB_CLOSE EQU 16 ; 16 10 +DIR_SEARCH_FIRST EQU 17 ; 17 11 +DIR_SEARCH_NEXT EQU 18 ; 18 12 +FCB_DELETE EQU 19 ; 19 13 +FCB_SEQ_READ EQU 20 ; 20 14 +FCB_SEQ_WRITE EQU 21 ; 21 15 +FCB_CREATE EQU 22 ; 22 16 +FCB_RENAME EQU 23 ; 23 17 +GET_DEFAULT_DRIVE EQU 25 ; 25 19 +SET_DMA EQU 26 ; 26 1A ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ +| C A V E A T P R O G R A M M E R | +| | +GET_DEFAULT_DPB EQU 31 ; 31 1F +| | +| C A V E A T P R O G R A M M E R | ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ +FCB_RANDOM_READ EQU 33 ; 33 21 +FCB_RANDOM_WRITE EQU 34 ; 34 22 +GET_FCB_FILE_LENGTH EQU 35 ; 35 23 +GET_FCB_POSITION EQU 36 ; 36 24 +SET_INTERRUPT_VECTOR EQU 37 ; 37 25 +CREATE_PROCESS_DATA_BLOCK EQU 38 ; 38 26 +FCB_RANDOM_READ_BLOCK EQU 39 ; 39 27 +FCB_RANDOM_WRITE_BLOCK EQU 40 ; 40 28 +PARSE_FILE_DESCRIPTOR EQU 41 ; 41 29 +GET_DATE EQU 42 ; 42 2A +SET_DATE EQU 43 ; 43 2B +GET_TIME EQU 44 ; 44 2C +SET_TIME EQU 45 ; 45 2D +SET_VERIFY_ON_WRITE EQU 46 ; 46 2E +; Extended functionality group +GET_DMA EQU 47 ; 47 2F +GET_VERSION EQU 48 ; 48 30 +KEEP_PROCESS EQU 49 ; 49 31 ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ +| C A V E A T P R O G R A M M E R | +| | +GET_DPB EQU 50 ; 50 32 +| | +| C A V E A T P R O G R A M M E R | ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ +SET_CTRL_C_TRAPPING EQU 51 ; 51 33 +GET_INDOS_FLAG EQU 52 ; 52 34 +GET_INTERRUPT_VECTOR EQU 53 ; 53 35 +GET_DRIVE_FREESPACE EQU 54 ; 54 36 +CHAR_OPER EQU 55 ; 55 37 +INTERNATIONAL EQU 56 ; 56 38 +; XENIX CALLS +; Directory Group +MKDIR EQU 57 ; 57 39 +RMDIR EQU 58 ; 58 3A +CHDIR EQU 59 ; 59 3B +; File Group +CREAT EQU 60 ; 60 3C +OPEN EQU 61 ; 61 3D +CLOSE EQU 62 ; 62 3E +READ EQU 63 ; 63 3F +WRITE EQU 64 ; 64 40 +UNLINK EQU 65 ; 65 41 +LSEEK EQU 66 ; 66 42 +CHMOD EQU 67 ; 67 43 +IOCTL EQU 68 ; 68 44 +XDUP EQU 69 ; 69 45 +XDUP2 EQU 70 ; 70 46 +CURRENT_DIR EQU 71 ; 71 47 +; Memory Group +ALLOC EQU 72 ; 72 48 +DEALLOC EQU 73 ; 73 49 +SETBLOCK EQU 74 ; 74 4A +; Process Group +EXEC EQU 75 ; 75 4B +EXIT EQU 76 ; 76 4C +WAIT EQU 77 ; 77 4D +FIND_FIRST EQU 78 ; 78 4E +; Special Group +FIND_NEXT EQU 79 ; 79 4F +; SPECIAL SYSTEM GROUP ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ +| C A V E A T P R O G R A M M E R | +| | +SET_CURRENT_PDB EQU 80 ; 80 50 +GET_CURRENT_PDB EQU 81 ; 81 51 +GET_IN_VARS EQU 82 ; 82 52 +SETDPB EQU 83 ; 83 53 +| | +| C A V E A T P R O G R A M M E R | ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ +GET_VERIFY_ON_WRITE EQU 84 ; 84 54 ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ +| C A V E A T P R O G R A M M E R | +| | +DUP_PDB EQU 85 ; 85 55 +| | +| C A V E A T P R O G R A M M E R | ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ +RENAME EQU 86 ; 86 56 +FILE_TIMES EQU 87 ; 87 57 + \ No newline at end of file diff --git a/v2.0/bin/SYSIMES.OBJ b/v2.0/bin/SYSIMES.OBJ new file mode 100644 index 0000000000000000000000000000000000000000..3172652e327af170404de7c9342e61201a7a361c GIT binary patch literal 384 zcmZo*W?*!*o+in_z!e-B?CIwj671^E4P=J6`o@E}n`W>xXyh?4F*6=rP{hE8=OV%*&<1%N3lOT#{d;Pz+S2P?Ddo zkds)Ho(fWzmYI{P094?Vn4$nwkegXtoSB!dpyCWQ$}_JdwWy#d6-Y9ip1{k%z{uw0 z=;G|}8^yp7Gl2)lX9ef&q5bc=&|HHtSCV&yx1qu`fa*!=5Au3A&B`0t%#)@2tTa&xO?$V0#>-%Px zWaQWd(nD>)lKC1R z5#^q|c$6+p%#*YfZj(DYFIys|l~yvyLQiSFmCx3=WEdrJqfGC z2FVR6rwRWeB(3`d8C9Rp)-;VdC`21ybX3W*5q#PZ^=gQ4b5|7EV*M~(t{&#go5?y~ zE;#a+WijPv);0J&7+VpQNI)n(9OUG#m6|i{+6|~O+khK^KtI@#quG)7#K{G=M>&%x69)GVU_=tjZpc^GqkUkwr7t^O2q`)-vigq zihUj0C=@zPLJcb;o&GhJG1hUE-KbZB$QuY*bl$XRuTnJ45!s5S>>3ComVp+_b#_I4 zLqc@i7@sCZzP_ijmL>OfD_diaA@MYE>YE&{C>_LioiA6QsIM{fFVBgjFL9G{lq9Gpun(<8 z`dI~NHf|-v??Z6j!nqDUHKuTVH=AX}>X{(;pI1{Dv7hw#rrW}}9HGMlkeEl%B|BS? zAhqHM6Ck!(tEvi+HplRE=OAtrE9P*sT+H$h?@%tHt!lXYbI+)!*C;kh_8UJt8a-52 zo33GdryVNCjpA#e>2geOmd~@7$^C44LGTRZe@-vv7c}|DNrvaq104YX6w8_YPOxoK zI}JbmUc`ZsAFDW<6j6p49~d^6Ou=;6TzbaGH{-lS*?6{b+l1l6eS+!4cHD@KY)Aw} zAzH;T6xt%p+|pFvt(pxfOvs-dLVNh5D#sC2WDg~b&s>I;rVaHs_ zm;^La8FFZ+05nbDZ;#K1IS(j~IL!MnmnQQ$71;+kJ2%Je9UT4|E&Zv;R$1{mn=(5`;^b{Xmlqcw(H!uly*04dmTFj% zwAeAM+^VlI49?R^{OeHE-dyOcfBXz{xw95`8kF01T4VI19m3omV-AhOoddE=x2wa* z0W*ETQ3i0uG#O;V>k{nBzz}O`fj@)=d)nZAf!U8Oh9CHyJ*VlC zhZcW)!I*;atUqQ&2Iv9uN@)!40QNh`$qWj^8$W9BoQ|eLCZMkc>BCyesl}m>5TbEl zuH82=xxP2K7kf8m10Hw*gqz8N;bC<})d9qsgT@zefIH(N|A8OlFWW<8>y@?3^=Zg} zntNO{JT}?kAr4-o*qIO^OeapGGQ1KT1aF5}kU;^~QCyTTnbVaILI}-_S?r-E*cX}* S8@+bkb|vrO2>i<{KmP!=?yj5w literal 0 HcmV?d00001 diff --git a/v2.0/bin/SYSINIT.OBJ b/v2.0/bin/SYSINIT.OBJ new file mode 100644 index 0000000000000000000000000000000000000000..3dc2c13b11d6bff036f8a9c4b7c0f75d371072e3 GIT binary patch literal 3328 zcmZXXe{2)y8ONWqeRoL+CJ6~Y#)$E>c}y^`n%kg(3w0bjc-V1>laK^RggU9!rftaB zMeEi!RcwQOu9tt-u@$zI4OAF^Kx?MZbj;Luc7V9e=+vfTsu27Gb!j0`F#aie+- z-L}SIksM7;3={q1ruMgPGy4&2iH5)Vt%BLqkU)%z zD1^@t*MM9FK|>wVpbaw5|t)w z7j0LDb&cwP&?2;wm*B}Sp)-c}Zmt_2__#XtuhiSND-CSxq_<#pGih|OQ}a_VZl0mM|m)|SCkBPVUn1(WoCDvNbGtyh<)UNoAt)jub68pRQTxr~&t ztI-6nO$ZV+^oqrQKa8SaIi$&foWaT_Rx+HR{?O_Z9EHj(@s3JMa<}nBnI@D$s6a+m ztS0u#Vrw4JuuP>Al-Q7oX-lG`%0jLxD_b9{Y{jz5KO@V)^D9ar0nHV~DfXOL;_ej> z_%+qaI)F&Mmb`lf_CU_Pyd-UKIxX=|N(TyNi{#b`YI2rMu4?g_MZIiqVnn!WeVdi# z57Qb;vbVO!)VPql9@C5^-*Su8u~K~!E%ET!;Y&KX8dYKm$uK-9S0XKLr+%90XwbEbt-8{eVbv6o6#{(9_sU7D15zg7%0Y{}rgFNESHG$)mth zl0O1I5F#G~TLeW1Toa-qa7a)pfLlUzi6+$mb)>8XYDxJnuplUp0FRO46gV#GMjJ7@ z03Rtk0S_rZ0^s!&FeyY?#=p=-_XAm8VTms#WdLX<t37kH*0`1*G3}*oBbKe1+ltW!-@M>VmP6{!W z>=q&RV_=+%vB?(r*k0haA;wY%UI2I@7XfN0_8U$48t@7qdmY$k$h`^dq1<`kNs3(n zvV1NFh?KhscqlgplvD0qU>oHoRAuZY;1ptPARqCuFI418Kp*Axz!J){L&igSwlKRX z&laYc^2-2`@@oJ+9cTiahWu7w7vGSUcxEtFyFu12mdxj=;T$f=vp2(Gw!HS1DUKwxK^@>lZ zH3LsZ|GZnPI8&_ReA++1BWz5J4|5w>g)W#?3rE;!cZbDc{f6&fd7uh}*X7t#{db~+ zt`Z)yicIM1_BBENAm3cPljGTQXRiqBwZ{)ppn@&at_faaM$@b`-l&#PvMdQh2|@`0 zXR~uzwPO~h?6A{3=C*h4kUsUDCpt^ge-f4M8^)>Qf7IXo!>RC{zTWO4kIU&ER{ZfF zX1=U_(!OT@ti2*MV#&Emtmh zEuev&Otwq|WMXDG^NW?4imL_9T3yHg4tbUYNpJ# z2DZ0#)(3D(vxB!Mh;c|0=cuHfQNb!{@p#Mbmm9CYvQYI1e%YU%Kj+Hm??w1%UjOKY^Y zK?Akh(`>~XA#3}5j+Q1XdzBO$JKSzpTcD9|Y;!rbIr+d=m)9E*5YyvyHSunb*A;M= z1$KDaom(AkJIWlL4v!bT4mxspKPQ)~`#-`S!L9npN`TWx%m6RQcza}pwgIT4$R@3? zMTJ_{>qy=SsU$@90Jja1kcMAscpi917kLrbtCLxgM3jWuC;t|3l6(Ykk^E;(VpRyz zX;q4x1zzJLtaARGms#CeBt~ulPw|mYfM4;EyJ}zLb5$7?G?>&rWh3AuRU z_ZtOVq1yyEF}MnfT4zUFo2#Y0ugM?i z^ZK2Rc8|Y>Ct5XFi{8aeF1Mq@i{3U*r>mN%ZxEi`B5kGnyq-Y&BBJ@hN+`8uUrIDF zh~Fk$joZ`W@cv)ea-x4~{yvw_-`3s7erPNq8rM>L@M{K@>)Q$Zb_k*ImCt_xKV-u$ literal 0 HcmV?d00001 diff --git a/v2.0/bin/UTILITY.DOC b/v2.0/bin/UTILITY.DOC new file mode 100644 index 0000000..a63793c --- /dev/null +++ b/v2.0/bin/UTILITY.DOC @@ -0,0 +1,813 @@ + + + + + + + + + + + + + + + + + + + MS-DOS 2.0 + + Utility Extensions + + + + + + + + + The following notation is used below: + + [item] item is optional. + item* item is repeated 0 or more times. + item+ item is repeated 1 or more times. + {item1 | item2} + item1 is present or item 2 is present but + not both. + indicates a syntactic variable. + + +COMMAND invokation + +COMMAND [[:]] [] [-D] [-P] [-C ] + + -P If present COMMAND will be permanent, otherwise + this is a transient command. + + -D If present COMMAND will not prompt for DATE and + TIME when it comes up. + + d: Specifies device where command will look for + COMMAND.COM current default drive if absent. + + Specifies a directory on device d: root + directory if absent. + + Name of the CTTY device. /DEV/CON if absent + and command is permanent. The /DEV/ may be left + off if AVAILDEV is TRUE (see sysinit doc). + + -C If present -C must be the last switch. + This causes COMMAND to try to execute the string + as if the user had typed it at the standard input. + COMMAND executes this single command string and + then exits. If the -P switch is present it is + ignored (can't have a single command, permanent + COMMAND). NOTE: ALL of the text on the command + line after the -C is just passed on. It is not + processed for more arguments, this is why -C must + be last. + +COMMAND extensions + +IF + + where is one of the following: + + ERRORLEVEL + true if and only if the previous program EXECed by + COMMAND had an exit code of or higher. + + == + true if and only if and are + identical after parameter substitution. Strings + may not have embedded delimiters. + + EXIST + true if and only if exists. + + NOT + true if and only if is false. + + The IF statement allows conditional execution of commands. + When the is true, then the is + executed otherwise, the is skipped. + + Examples: + + IF not exist /tmp/foo ECHO Can't find file /tmp/foo + + IF $1x == x ECHO Need at least one parameter + + IF NOT ERRORLEVEL 3 LINK $1,,; + + +FOR %% IN DO + + can be any character but 0,1,2,3,..,9 (so there is no + confusion with the %0 - %9 batch parameters). + + is ( * ) + + The %% variable is sequentially set to each member of + and then is evaluated. If a member of + is an expression involving * and/or ?, then the + variable is set to each matching pattern from disk. In + this case only one such may be in the set, any + s after the first are ignored. + + Example: + + FOR %%f IN ( *.ASM ) DO MASM %%f; + + for %%f in (FOO BAR BLECH) do REM %%f to you + + NOTE: The '%%' is needed so that after Batch parameter + (%0 - %9) processing is done, there is one '%' left. + If only '%f' were there, the batch parameter processor + would see the '%' then look at 'f', decide that '%f' + was an error (bad parameter reference) and throw out + the '%f' so that FOR would never see it. If the FOR + is NOT in a batch file, then only ONE '%' should be + used. + + +SHIFT + + Currently, command files are limited to handling 10 + parameters: %0 through %9. To allow access to more than + these, the command SHIFT will perform a 'pop' of the + command line parameters: + + if %0 = "foo" + %1 = "bar" + %2 = "blech" + %3...%9 are empty + + then a SHIFT will result in the following: + + %0 = "bar" + %1 = "blech" + %2...%9 are empty + + If there are more than 10 parameters given on a command + line, then the those that appear after the 10th (%9) will + be shifted one at a time into %9 by successive shifts. + +: