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 zcmWH^$ShV+NXbtw%}vcKQBX*&D9B07%qvzX$w*bm$S()ej()+O3aQ1(i3O<&#i@m* zsd>q%#R`cn?bLU~4No_%(B!xUM>X%1%><~g+!>n z{4|BC)S`Tley{?tWkz}m3ITZv3c3mkexwc6dZ${Jv|jtGSf3liopgOgA6WK&{YUd z%}Grz$t+7nHCI8wF|QJCHq7XfjKmTJh0J1z$(h9p5U(nfmT)U!0noshgailb;9j6Av$!vqGpskV3G6ze13Lf`XeusDht@vqFf1r-HwNpF%Jw z&YVL76m%7wON)y0ixdL#i$SggiGw0TLBTcHSs_{>AV-Q2GZb>UzAyu zpI4HYqoAe`mReMjnVgtINPikgzk-4S$WDdCyc7imkYNhB`DLkKk0nD~QIZel733FZ zf?R`$KZT@9UM^6A1%(GV#*3jTE-kaDxC9Yla4nGZos*fD3QY~XTwr@ahA0%LCg+13 z0XGeiR3Q42^K(jb^PoB*Hi2^jYU0k%OVv|Q2#2O_xMARoqX161VDCUY$IF#j4EAse zD2;%ek&&O9s!#w4cyLN|4h==bNN52x%oN~}k*DAY74yw6ONF`=5^|*l3i)}d3Sj?& zl0|-Li9&KlVqQ8Z?Ld434KZFWNaoB>17)WaQ0~di%!8Vi2gx}3X<(C}?uGatmbYR0 zLFGX}9w?7Of&pC4z{(DgaAta5eo<>~KO={O6I2W%98&Vj^AI5c&LNOAxgg;I3M#bVNXjoM$Cl;kZ0{}TtoS|YEfs&SARGwdy0uC35 z_u&BpPa~j|11dYv0wo|%0cVgvj6z8y)C?2_Sg2$|5=l{JdPYfZesKvj3c-m5rLf9V zZ~+AYhX0cile3BNJh%#jC2s=R1B>4&$snNO0FoTQ#RQtqb5heVJnj-41gZ;NQp+-v zQx$?s5=%;p6@pR=@{3A9VE_piXen-{0M0|;s7=n#E6&eJRZvJN$}9ubk>!~=ISTou zB?YA=3W*BN0YUHv04R4Br6#9l7L+LDr}1*R1P6h`9Ha)h;((OZ5W5vL(u(qP6=1eN zEh))YD6T9nNzK*7a9cngsD{Z?2!hIh9SO1l;S7Z$u(yg86p~AeiolH+NLVR=N>7OG z3T2szyj;a4iFqlBMJWmjnRx}JC7@OT*gQxjfwPu?8q3QC$^_u*2^1gDN&;T2qg5?X zO~{Ec*cnto1}B!K;;dGoF;a}=Tev}xk{n+7Wfm(GCzhqAfQ#SEVvy%SHFW{Ba^&So zPRs+f8H!SiOTYy!sN4q^r$NpE@X!Ot7)U@@Aqb)n(;!G20$!AqLLCQHUyM?GBZ3@S zSwm`*%o2r+L}*K|BqNoV3oQkJ(@|M!3fO(1aDvqoVE4Hy1SvQw1S@zd_$j!9Y|EIXMd8G8`0f3dPAqsi}Di;Fttk z2u&{O`JieJ(#8N)zPwzpz=XKMM?qHsY@&isW?m}Dd?Xvap?t7{Vg+zAM>ZT99I1IJ zAcuh50Z&btdC57YDXGPfCJfXuC|2`;4EI&=S8!2qRR~s4Q1Dl91Cs#?kg$Qa+(62L z-Gji5)e;5wqQruX%w$l$&r1R41CTt}&CqlfP^@6Bpr@w?%45X}xgcrJyt4f4R9K{@ zLyS-;N`;yLPvt3~7AVLY@C=|)tf|M#

JuwEUc${Bls+0#vgWB_@}o7J;InC{+P$ zR4S0NcX)SG;kU>gi3=cr~I501%F8I z!vrh>B|`I3Qj3a{^NUgy{PUn z)F~%3FB|3zb7YyI)Uwo~;#7sO%#_r8m?R$BZ%1$(jA;TiMQDp zq76burh-x)s5gpgIWC(~V%7=NE5)=Jr?XLF$~Q4RHLoNQ!)jbMn?W25A)PA|^DuNO z;0`d9ln|bgS&|CTjT}?BoNa<7o-8cTu=z+hA+;2IZEn1h^v;NdIUO$-z&6pTz2lECFxVjif` zky(-oE?H61E=(b4SfmInjgmSo@R);=5@8CV=73E?No~ePV51BSKyAT%h*c;l3ZVd- zqfye28N}5F23Y-vl3L1(5(^X(OBA3j4p3_Y6eqk~LB0y$#vU|bfCNFo3mZlN$9oQX zykiI$D4+>};ynjs7&rvrkp&s;0Hpwh;>6rk1%0O)M_XOwR)ksFo)dE2MzNUNZ9( z5*3p3a|;qnGLv#rdAZ6HE5R-YbwQHz^Gb^HbKuQ#g-po6DL7&vc@NeTf;89y@)Qc7 zaRiZ8DlRF?%u82Nutt*r>qC+S^T7nFAk4VLyh?@ql8n?MkYkfF^Af>BZTV>m5DSXI z&1Tq8Dr7(i++6{ALm@3Q4>Z7<3@UJ-{c;SiX($yaX@Z6|K%oMP*`hMg2rOuTqySPD zfyPR~F_BcMfEF3B77IM&AbmH;s4cR!pgtxzND*NQ>VboYvJ}cQGLthvoe)sD2pXJC zN(DDVa}x^+z&$Djuy2Y|a}zW3z%o#eDnQKuxsI0$)=7c%Eg)`C06C&qK_NXgFSRJK z1T<6&8Q=ybZje==l%fC`8qUlsNi6~;{L~bPfASR+K&`q;1%;wgP$wJ|4d8L|#5{%6 z3Xsao{5&1dusleaqJn~F8ptII;6Q--2O8{fw`CSXM$0w)LVYwrsv*NAU@g!-5Tq*$ z)t{S~ovKh;pa8bABsDK3H3d2-UX-c}9_(tgBrc56^Xe8IY>kP zL8*|80J2pf5S(xd!QO{yR4`YtRxngBR4_)oxCS0cp93@X-8UBk=8 HKr{dVd_s*> 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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 P012X3lQ{XiB*9Vuc#L{$ 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 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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 zcmd<(;^k661apT^6T zl3JFToC?#Vr=Sp$k&5a`aL_3v=H%p;7b_$xAl#-43snZ*hU#hJMUIh6_uiFpbNj=|2Jo(d32 zaF}K!g2F1bs3b8nPa!!!H#adar5GGoB^jyEa7`@EhPodd&I$!Z`N^rp#R_24LHg73 z!Je=JxdoI~Tr!KZ6(E`wic^zI@{7P~i&7I)zy@U&gIo);vRENCFTXTBLm@do1r!;O z#0F9bkB!7UNX%sBWtL{?P(iO5w za|=N62l5`sC{I7n5QU=r(vr-)RFH>q6H`E`$Wfszu_!aOq!JvNAge%%6`)pRR)Ldm zG1!)r{Jc~oTOih;*b^KXjA~6D*mp4D-29Z%oK%R{K@kRZf&$oc3J_TZ1&!j;f`XjP z)D#7Uq)G(^Ur*;C|6qT&5KRRIh4Rdt9H@RsC}mcqDj??{Q1B>#f&(gulG`BZ0ixg8 z-_Om{T`xE?SVti+*%cImpg_(` z%uU4zLr8@I2}x+eO97X~plZhkt__q%z+r~46*=%=g_Bc|tD`r_K7T(@QSR^NhGd~< znu5O{s2Bj3`e~rtrUCL)N@`kSX%47nQSf(j)6@Yap5%tjmmv4#78K=|r9whL zAu%a4C$pqd0aS`9Bqrq-l_2yN6y>KECFT|@xuDHIf?mSuu+BBZNRl%Wi;zOYIkB`DYAdLWEy-6XN-ZfZ%2TibD^y5?xG1@_s3`1)rXRf(s%-)b-WjsmU?S(bLDpH4NmLkf2akPz<{{`UJZo`3hVZz#Au$grV?u;LMXo|oYFcVhYF;v^TuX%& ziePy?1qB7qGzA5)<)GRR5h}&0IjPAdsVO=N3i)}UiW$iwh>4&AEgxRUg3Z%G=m+yb zbwFlGacWMQ0>sIQkV-uh60-0pNy#h%SHP7B{h&q!DAg$xC+4OqfN~rtBJ=Z7K_vnx zbwKi1F+5O%JzRZ!Kp_gxY6!!?rCd^KdS+g+LTW{7aw({AgBetuk(!gEpiz=vpqrCg zmYM@<<$=p{gnnpSBELveA+0DsR{@co!PYw}lvEaECMV{AG84Ex1g>i!e$CBH&nQvI z$2d8sAfHdJwCF)tUaT=4hf zZUMA(0i`Wi(ke^LDNO|x4+=2%WELxc+Mdv| zB^gwFL0h)qWDk-9m5>nmN^l%OYYu3%g4!T@3JQo&f!L8*tYDz|g0x<;Ct_9UM#gIg9q>z_d4vDtpjKsXW)Esal zAPrQILj1_fl>=^6mSlh$s-PxgYGEm;W&qo@8+hX0FTy^dVQ4K>=1|@N$7H0u=?IyzA#5;tFb3fVv%^ za0Rzuz-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/DEBUG.COM b/v2.0/bin/DEBUG.COM new file mode 100644 index 0000000000000000000000000000000000000000..41d127b04cb1dfa3e3f8238480adb2488bf7beec GIT binary patch literal 11764 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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 zcmaEzIUy{ys93>J&&YrQ9qj60+roKP@$jxctS`R)-@>zj@vP!uxqpYY7@bw@a%Y+0 z(CyFb`TZfYJ9oD~Q&+s0{NXP4ewZ|3$ov3~WDH8Q3ndZs9$vxO*1c z#n%wH#p|r%?*IR{c$`%%W&x3lB^f*Aq#2L12{1A+yqNsIgl$(f>kI$?yOyxN@cjS6 z`+t`hFXM~A|BLw;JNbkdJLDu7U*!HT$EZuy3jNM`ajD2#Fj4v7)5q2O4oxN*Yod1-@n&OK>ptq#`ssDCqv%ZM`w}X-AtYW~6;C~T33O1D`95#6+Os}7C9XQOuz@T@Gt&PP| zkAba?MX!_ZHj`XnP(W~yUN@f@qn7nSOo3-r^%mV?a&d`_ijFAe*q6of zVm(92RXt6R5>OTg&4m-fHn+mw1#sF;V|`inkLv(?d{ks~g#2LzUr*;C|6qT&5CvU@ z0M`)LpkRfCEbCczupDAJ$8wqFG0O{M{5)M3 z|6qlb%;Id7;MC-j{336~BCig2aN; z#8P;8T|I zH4su3P?TC+tdN*jsgRvosZgGgnge1e5 + 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 zcmeZ`Dr8_`U}jKY;AHs!--DrnVapx{1_lNN1_p+|ybKI73=9l<3=9lej3CibJlsOy zHD_3AQL%!No`J!>Mg}?K0|8qM&MMk4)$+^j(qiblwd*Rw7S6MZ@~6Aym>57JhhEHN zC}!=u^>QP_eglRzHVP$zHoPUgHhQIOYRB0082+z%{mM`67%RhzLWUyw{Y4l`^ubC% zDqf5C-P&is09K<{!fwM*!o2GBmt(99eYYCy^cen^2OflP%6YcjlGVt6g;zmt{W^OD1VK<@eNXT$rWl=0``T?PzWY&S5RRV-p#T)^;J zc*3sNV9%W1^^4*4w_VAMuRreE&9GC7A-G$vfMJXMS;go^yWI@FQKgR;9%f*bXRu`u zD88)v;QvOJ%MXGA1A@CR7@yq009NdDRxvsvGOF#!#TVUT`x&$^H2!K}C|=g~>Efe> zdl|S7l(03vVqjvv&?&Z`q4^O1LZp*+}`W|G@E(S*9lN%V3Ez)G$&(Lglkb$A}tnqCyqr`QW6(cBaws7s*!f;k` zR|1%~ZyUogm;VeUkJjiI6v^0d74fLV>#*B!6$#h~6!Tns41ruXUf*x1`OjOryZvrA z-+qQI_Tk-j1q^b1w~a3aci%s&7%d-P%(knB@#WcnP}>$>W&pVjGYod^W&i~v3&R$B za6q0_j4oz=Isad`-EM}3dl{Gy_Z?7U)cwzQkfHSY7Moo~48|wVDi-N2-oya5*&)2! zZWF4_MciBLg1hB5F`QM5KD|qc@ukPVU3`o$o&NbchUVntC+hoVCKu%w=ckqEhZz|d z>A6O@GUz#Z`VErI$x6r_o_WdnMMbH}B?>P7!3t%mMa7xa=dPfu5R{sj0xl{mbgo8`~ 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 zcmeZ``pL-3z`&ruAj9W2YV}UFKn9soQmlwnu#ltxSUUP<}78NTP>KPbpF*vJe z!&J+&>kQi#&a;Ya#s>mU^Re%1VED79>x9u;$Nj(9|9oD;C%?Oj%IFK7+&-4XJmNIv7d?I zHS>OEhGUHXUoYF`&ECbA&i*=ag5QhTOhq4#u`+aD+g-)cDc zw-DlrlloOh8e?+Ud^nTGf_`p@egn0(%#q9{X#)z+FGsy7<`HU*xhzc3*pu z&bs0M7N4_<4R*`e{+BSnoW-!ailaMRsQc54M3y4{PItC|-4nn9zg`5e6cu&4vqf4T zEaxoZ<33O-`0_sEF}6)?jIY^26jS$!g`3&B<+idh-xOtFSiG67Q*JBUpU2{#mz4+y z1_V25-;`xwc=41mIwJD*i`UZ{>^8A6lzazKj3u1AR( zu)M5e+{MA(#V5f2GWb8lWu4(Xo#AXR%9x9uLR<00+gLtpkflVqE2Pp=HOlLVyXE_JhD4x!Gj^k|W*cccZ>^89dFVO*MZD1;5 z>nvw`S^EDN+XlA(-Q^r0Gpjftj2DSaMTVW_9IrV*mWDvpdVl~=3m|y!&0NEtQRLuN3aRSI7Z)T8yEAxv4=GXocAj)mw%H_ano--CR zzcvChWtd->gLMcqzg7T?a52A71&c5;zmQ>m%{^h4K6@9R7yHZme>X6IQin}q5t~g_ zJ(J4)!++M;D3tuR;r&s{`15d>@kubB-G;Y>+41!kzwUo=HoT=wKM(&n++eqz?SF~z zF}Ce&{{wbCWbfkp0gBT%OcCAJ_wQf}=sNPkfFa_A4nx=R7wQaMhhHc$>_5!bD>x?KLpz2IT!{b$QUVm+{TgCRjl-cbyrwuQNV%nep5n=`DWB^-J%KT#QKd{N3AkD6f zFB}<)ncYE}SA#UWqi6;Rv4U)bYi{^wb-0B2Wzc_+6)*k%yScwC{codC!e+x+!t~?t z&%@wY0LQ?O!!LLliWm>SkY^}nJp6)@;c$03Tem--_POqV8@T>_TG#!(lG5U-vcb>m{Pv=N$ihUZNS!rWwwm8P25{&Z8O5*B#F11Tru9 zg(pLi7WaV?yBEF;-9NiuaUUq*@4oQ;*3SR`H!yB-I;&X3(|w-%WQk;SXFlJL!@C68 zyZGeUU;JZ;?iTO%XL{NFdj})KYbN6Z(LWD&`wMi(vuK~%Vt-cgaQ83fAO6+{OY|FT zrAnFnJsNDeN~9WWc}s*?nHb!UvGTefW98~T(S6OG(`@{yW zzn|7cl(M^bUw70#c)0sIC_TI|X6O#*=`QDb@%LZ%Iqg#~3K>B8L>4Cc93mRcu&b24 zi*E%ear!eH-j%`L#a9C2I5B`7{KAT1*H^ZkObjm!8Q`H74hpq!o^F3WN9|KDBp8Cb z!-ZZL{4ZvH$@ic8Kq*u7;plFEf!B|NcQZ0-8sa(U(@=NA>FCYLC<_y;SLr4|)u=I5z+=9MMp zWTq$-Bo-y+rk11@SuyZ(iMnOxq$=d)mnfv=m*%Bd@jE4^D5PcPq;dqMCZ;H)78T_e zDP-nZ@psZic$Lx^70gyjy 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 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 literal 0 HcmV?d00001 diff --git a/v2.0/bin/FORMAT.DOC b/v2.0/bin/FORMAT.DOC new file mode 100644 index 0000000..ab47f54 --- /dev/null +++ b/v2.0/bin/FORMAT.DOC @@ -0,0 +1,393 @@ +FORMAT - formats a new disk, clears the FAT and DIRECTORY +and optionally copies the SYSTEM and COMMAND.COM to this +new disk. + +Command syntax: + + FORMAT [drive:][/switch1][/switch2]...[/switch16] + + Where "drive:" is a legal drive specification and if + omitted indicates that the default drive will be used. + There may be up to 16 legal switches included in the + command line. + + + The OEM must supply five (NEAR) routines to the program +along with 6 data items. The names of the routines are INIT, +DISKFORMAT, BADSECTOR, WRTFAT and DONE, and their flow of +control (by the Microsoft module) is like this: + + | + +---------+ + | INIT | + +---------+ + | + |<------------------------------+ ++------------+ | +| DISKFORMAT | | ++------------+ | + |<-------+ | ++-----------+ |-This loop is done |- This loop done +| BADSECTOR | | for each group of | once for each disk ++-----------+ | bad sectors | to be formatted. + |----->--+ | 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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 Mx|kRkN*HJl0Ez-I5C8xG literal 0 HcmV?d00001 diff --git a/v2.0/bin/INCOMP.DOC b/v2.0/bin/INCOMP.DOC new file mode 100644 index 0000000000000000000000000000000000000000..6c187b625246e356308f778df8173f9b9505f09f GIT binary patch literal 2688 zcmd<(ax6+sELJGbNG(cLFw!$n$ShXK%P&z#&d)7KEXhpDNmVG%EXhz%C@4xT%giq= zR!}HQEh^5;&ns3?$WPLJkib4ulYfdGyHU)*GN(F`T#7czz{4}tk zAWaG-i6HkSmMEAQSQ#jkXXfN6nZoP>`RQSCU!;aT>z7 z0EkmSApmkqX>n?bLUCnrNop=crGk;ULSkNuf{}#+$YBcUsU->ui3t5LW5JRj--7JI z<`M-3r_|)c(&AK*^AY+%%E3Wiu8^FVoROLW3GV!ojMO59l+5C6g`(8r{L-T2)M6cw z&Z1NWh0J1v{=9qzg|y6y)D#7Uoc!d(lFa-(1%=E!h1}HK{338z793cu8f%;FLq1%-_K^3<}_A{_;=?-eo<%Tg7;pMk+Wv`YHJP`9vx>xhjMPySgZZ_$#=(hJYj$KtA>eW1XB=6Yzsft3EC z>AbigF&UIBKxGiv9#lIK_QB&6mY@_8lk&l7J6{1@WWfBInWun=eT4qp#LT>sM37{0 zer_sU2}l4GiXbC$QWWyj6mm;*N-}keON-JHlacZZD7=exKw*_xtWcC%SejXsnxasW zkyxStb2r%23Pxrg3ZS4tOK-lxF8;v^(8$b9EGPh_@uEafz=KT5Qvf>)Dv(%|lvz@g zScDW`8L5dWy2+I}nRzLxMY^cwfJ;kIfsmG;lapT#GP$@ksVKj+Br^|^Zxo7B6G5&` zRY*%LQOL|I$p<@60Tktlkoo`~A*sokX_=`hpc32#l(qE~6kL21lJmjA2Pu(KK$%$~ zuQWFaRMNQk*c$M1<)$X)fkFn!p0uL;Tu`c2NJ&jgEX^rV0PE9HaPhGf@GoMe1-fxu;1dy3s$3G4X%Jdfe($k zLT`Q%L_=bZP9jo4ot0Mw76(Udem0m5BCHiM(?Bg29fh3y#1x3P5Qf1WlA&X0nE_G{ z!PW|i#o6FW1tm=(G$O?cL<> z%#zIfyu=&@=ls0llA^@Sypm!okTlHl(7cq?B87sY)UwR{(qe_O)S}|d{Jdg?%o2t2 z#A1cK{1OF))QW}?w#R>{3sl{Mp6iV_H6f)EE@{3Xxz%EQJD#|a?Q2;wcp*S%& z72*PzgNh;URY*!jSd^lmkXWpsP!2L4WIo8PF!M|DVfssoD#3>47o-*?g2GxsBRE(m zI6%iGSjQiFqK8XqFV^SArb{(GN;t#U+W!*`QEO z0ZEh=gPd5bppcl9nUh%pQk<`#P?QP^m;54F93jy@=J3- zfuB>JSXm4<~g~X)%q7pp?1-Hb^ zoYJCHP;w|rEdd!*k`Ib5h-*N;0sAy3H4&OfK|+~%pfD@VD=tY)%1MPpj)FpIUP)$- z0?5L=e5h~0p`BKmmkf?~P|$(W2q@gaUNl0@foZ9UC8b5FsM*gsBe5tkxg@nnAtkje zGdWd30USi2@B}5@y!>(nXr4*|#U&^op+shGYH~(mUS@Hwo`Qlx05lha(gh@SxMUV* zD=2vC`y(9n+pmPq-+e4DbiCwE4e9*jGkXT#{%DLcx z1!rBPRHlGP)J_4=L=)@@(T~V{8s!<8$r%cHsi`U85+^AYp50SWGmle%Rj?;0ltB^U z67C=5qM%TapP2^=K~OA1JmLZgOOMnzjj-8u@1c_|8+Y0#7nbsfxqaMcj~P+71Qd5O8H3JUpYU>`swK>0o~r#K(v z@cg8b#LT?Z6g>rnkPK*iySRpVI=kw+1bK$J1_djmq~#ZZstpB&>1{Gg|x;FMXSU=H@Pf}@85$P|S{ za1jA<9Z0_+*fJzDU{L`zMF*6uz!hCir9u+eJb2Lx(GSixnR(z~O-?LM1qE@ULQ-Oi zLT+kqeo>`DW^Q6SSQM;8!ObxQ90ER`!66F%Zt&y}uC*1M{asvx6#^WCgI!$|JpB}0 zJYf}=fkJpuW=X0-Kv8~4YI2D}S!R9?Qr0q52+hmR%P-GU2+hkZ0XYqU{anK#J~mQt zfrN8@i9%6oVoD`M*ch%iIX^cSl)kX&HBoR5a)yKoM3LL6B{LCWDY7;Th2YfWlKdiYHc!hh z%}arWh^0b65hNeymzIEny&$mwR3m}RfqU5z8fO zjx;m{yxnKaZ%(=9v2vnvOmt?~1#Hq;;Q&YY|erZWTX$hwDU^W?{ zYw`>AA!w5^x+Z5Ie`jxyHY@=F@{gejC=@`c&(q&I#0MNQ8pWxp3Q4Is`Q@6J&I4;Q zhH3Ki_fzn6@&$DZd>uo;x)soEq9jEirB`TG3+h{xq^4Jbf(hNG8i-(O9;i(S&RY-x zG!iwQsOvm%!BSLO04YjQZK9|1EOebBLtK$6C}`mVuFlgkQ$g)sjL1cABNi(ZrHH7?>Hn7?>G?7?>H7 z8JHPL7?>Ga8JHQaGcYs!Vqj(vVq|8}V`OHqXJlsh%*f2Z&BV;0!oRn6of5w6QQV zOlM(cSjEE3aG8af;SLKk!zUJI1{qdn1|?Qz26a|u1|3#rh7eX}hD26ohCEhgh89+4 zh8|XChWV__49i)W88)#pGwfz%W_ZfV%IMg3K()23K&i?6fp2J7BEOL7BDC=7BJ{C7BFNn7BCbu7BJK@ z7BH+~EMVBdSio?Ev4G(WV*$fO#sUT>rUHgTOa%;|nF<)>nF|q18V`pKGp(;+#hSzKb4FA{)7#T&z8lwo-L1YJzEjudbTpg^=t_Yl8g@-BpJmRG#T|7G#T9) zG#PyvG#P^#G#S$vG#PUkG#NV?G#UFDG#ObKH5s`WH5r{4H5sEAH5oG*H5n%{YBDZl z)MQ-AsLA++QInCGNt02HNt02K!G}?j!H3b1!H3b7!H4lCgAd~)1|LRkh8RXGh8RXK zh8V^mh8V^yh8V^Qh8V_43^9!J8DbcBGsG|+V2EKn#}LDKiy?;bDMJk72Zk8NpA0dK z?2IvtJd81nGK?{d>WndrPK+^(DU30URg5u=9gH!I(->nImommMu4Rm2e8(8W_>D1! zQHm*sQI#o%QHv>tF_9^TaS2ll;{&D`MrP(1Mm6RbMmy#hMsMaA#sKCR#%AUi##ziU zj4PO97}qk#Fm7XxVLZtk!+3)^hLM9MhEa_rhS7{AhB1&OhOwL_hOwC?hOvhwhH(l@ z4C5k}7{=W!F^mUTVi;LiV;DtPV;EIfV;FT=V;Id?V;HSjV;EgnV;BQjV;I9&V;B=y zV;ECeV;HBh#xO2ojbYr+8pC*>HHPs8YYgLW))+=+wirepwirekwireWwire?wirfl zwiw20wiw08*Co`O6 zT*7dY@gc)WMtjDSjM0oI87mo2GIlbaWIVullJP#{Nyhh#CmA0zykh*w@QP88@fBk^ z<15B#jIS8?GQMK`!}yAEBGW6zVTW&F#O!}OO)g846# zHuGO56Xw56w#2|I7Z@v;UociMe`Bm*W@D;gR%fbU&S$D%u4SrVKEqVOe2uAs`43YC zGZ%9Ovm|o`b2xJab31bd^K|A4=6TE&%v+c%m=7{nFh6FlVE)Bi!OX`}!EDV^!7RbB zhgq3n53@bP9_C1fJesa zG~*uT1jaqgd5n9Q%NX}C*D>y4?q}S?ynt~J^G3!!%pV!|F!M9*VQy#I!+e}+4>Ke4 z9%eR{J|vh8vWIyE%O2(pEPI%DuOK9%c#lJ@Yr5T)9EEt?v@)?|1<}*04 zJY#TT5o2^>DP(kFnZW4863XPnlF8)6QpDuMQpe=P(#+(I%S>h`mW|9# zEZdl!SoSkJv0P_%V!6ZY#PXZjiG`WPiA9~oiRBZk6N??26N>@ET9$Z*wJbFZYguM9 ztYy(kl?-R#tXv)_Ytw>}(8cSZx^AuwG-_#Olnni8Ysb6KgT^Ce}{oO{@!;H?b~d z-o(0^c@ygq=1r_8nK!XMV&2614#a2K#QKSK&8^#g|8|D%b z8GrFk?h{ifn}h1V|F4Z3>OL`-3U#~vYCgcP`r$uR`D^Khx=$>n+}&=! zSpPGtGW>b{3@X#@_N%j9&Z*n&Uw7P}PIuNWx6h!!>1Y=S1O;8G@D_&7!(H=vBfz%0 z{pf5L^9BXlf3rHBS$7#Wv39{tX%9}D9^v3`Y7lM!l5;~N&nX1h2}#&YJDw-_J^ zrH$c#ZyV$PfUY)%|63RWW)(4NGJ+Ds4u%G3ifQ}%ueXiif4~N2up?NQUNLsI{rlIv z@83U$(x_u>lezyxvm!3Y*%pT{M-dm+|kY# zzOabXVQ~?sEjU-GF$C;b4E6O(ng3AlHoxI$u47>+4e5?!>tf%+(CPNexigL}Ab3G1 zHw$yXe={G>Spr;}SQqATGP|*Ly0LX0Zm?%4;s0;e$qkbHZ$3+q*@>mwjZK>^kF(Q_ zt=sJvBbyH=qZ`|6PmsxF&fRfr-Rzxif0_?7b;hxE^LP6FYj$H}YW~4c$~udSVGlDX ziIxfeFJt>(_U}d3|4z3b|NZ{Fe%bBzqtlJ;zaPu%?F;ibS^0w;EZx}3AX>WJ*gD_D z9%2C%0fB)Hb{*UcN>z`sb#OEMH_PMP!53)#2UMnAW`@W=%>P|w6r!Vb>dub=)mv*GNH`_=2tCKu4<&I(GCDooRu0%kEW zXflG$1QT6uUluiUA7@M8WMF`$=>~>oy97>_BB(G}U9a1}fE`TGgx%}*2f=|lr@LLw ziP7!P|FVCxR2VfGHz)+mie%7agl6#n+r_*$umsE!07+Rvr2d!vfeGzMfqL&hTLS0H zGDOM)W#`2uoQsP%7gupEF5m>m3OL6tYT^bL&5PqWLGETKWqx^vp~0?+yP%l)~* z@L_zd4dP8HyG32Z-7V$f4bxTpd^HD zw?Cb3|2hwM`LlNPefrm1&epr{^S`YOa_oOTE!n^r&>i>he>pRT0nG4}1g;O5JK8?{ zgD26xcmF_jPzXzB*e@G~l7y`c7aw+>>+TWr?)3Z7)%Nb66oT8ChqMF@S?q4%)8U=TX)zG?F$=OE<28}Y=9@FUofGDeINcYlyJcuQO3F>gW9Du$)4zaOMW6%>*13VfqFu3{2`UgEVqDJpc=T-?ca`Os3F~P|9ah7A;xUbgd}=!X8P~;>80tv&Ns2Az@=03 z8<*p5|3Goe=F#c)=a}1GhHke%+HU`ve}H0o0z-4%KZa6HP#IXl{IZdu+wGqND3sj3 zS-bry_wnd-`_f(Z?c%fUIF4?HPPcd6WnaLY{|5id-pxv7Sj%$ZMzIh~w40&Rf$6{B zm)AESB5v=x<2XPuqZf3A%d>xIZPC6#DBM6VE6t4oBH1X=7uG&pLV+^YL6W~Z-Tr|B|3HV^UK^ew&K(8N zX4%VEf8i;n@r@A2jy7mAJJ$B@JHx^{PLHm>ci*=%Sf40keksJ%@ROlb2$IOTckF{I zeQndQ@7;HX64M>0pdz69WZt{)utW?i1{UuV?v~pp3{Sq`WP7ab<9EicwvXRIxx0+{ z`x^*v%E&*c}LZ9l#rYkU8labX$A zjqhP@jA86N-PO(;Vb%5#q}c^jx1kpo|GM4&LEQo_)Xvm`M=xqD+y}RwxcSf+eUts12U^VPI!Z1*Y3a##T+=2;10<_cZ52Q!{71Z`(W$ee= zK740<&AmaqJMNDbdq>-c?+yDtd}k=*gSq}+--qw7U&D%OPP}pSukAf3Fem@}2MJaG zfB)LRadY=?vt0!zV<~%s-6n2^67e1Ppw8-L6JqBJ*uWMr>oLS z6o%t$HJl6#y={NKFOK5ev6iLpKrfpa0~@FX3s&1~SHsCrlDp#*)TCox|(w2c5$$(@e$cXhFoV9!{_-B8bDRmutyV(M!9 z|F5I%=f94&fB(ALe*Wu@hc<%1|^AFrK>;|VchX2fM|Nc3EdaB^w>Hj#6*Hb|DbAZQIjGrQA6T$^`K>r+POW|Z-=wScv2C5;f-To8@b{+%EJ22`P zbh!Qg@Al7zp@_wXvy64ee#Y18jdm%VGbPJqAoPa+C5#RM4Rya+H~cSWbcj?s2x_43 zxB)F2jF;8`*Znv4On5FIikHUG=lX02j`_0*6g zKqk90%0UAPLvNQGiw$F$u}#B<|3!=r0o`sK-F|F_m%e{&{=u-}e<`Cw6xSheJJ5{- zBpMLd<;L>wM8J!~{~PL97|Kk#!Qy3Xonai!zqpFon%y`IUh{OjaWo%rY<|Jj>Ba%_ z!T&N2WY-;H1Nr%X8OII*hJgQNY%faxLmRdK%h+~sF@T0LUL^j9`eKI|6Qt?`CzHVc zd~uxr&8#?k-Tuo3%zDT$jcKtHXS1CXC#cs8>h*WIfqH_V)Ybfk4HV>M0U-7N%h-C| z{>TONy8V(1m}SI>p%3Ip7KT4eo%h*}l>O=U`z6QL=k`PX&!;8wk)Xi`Hx5m_2L8CjfmN7fAG}rxND3R}W`?c7H^SIkD28P$SyY2Egdt3Q~rgt9P0Pbsof*Kqe z5JSM@b%6^^I4|5N=J{`C$2n^$!!)K&w|~gP9t(OwoirX$!h=cAYUctE_kmJHAQt%- zbN>G?V*!tqfQEk{5d#`JgP6+&Y00uRb2ET48fZub9)Hbm*cKRr+!M9KhzZg}nWfJN z@+K&a{*eoqmB#{d;;$X{Q0f0=|3G7PpivFv(F`}J^nxbtEeru0m>>;Lu+5k*{snTb zEW;PjK+++wbDQ6=fd+BR+~7^UPSC*UzixLfQ2#3KAGj$j1X2SZ#qD(a2kL)-#;H0F z!y7i>c+uUU0qJ{!G?e`Ul~<6SDyT0GR|@N(f=a#6?l=F-I9|;82g=b;|3PzfU?3<9 zmay&!WqQrLBb_PWMfE?>kXLsc#}Rh6fdAzz-~z4F?H|~u$JmTHL1Fx22`C>xdb&Gm zm;zq7{@XDh8bJTc*kIuY)&sJy^dGdeXnvyrGUNY32hL8nH{EV;K*NE|FJCe)cH`X0 z7#OgDVG9Gi(+zH~vw+mOb9B0WYX0#bT;_GSJ?VC5>va174!d{V(6AHhW?$?9H3V+N z>xZDuMi3+cFErq^cKcMy)8+OA)E+KkeksWa5i1eya(eR_nh!bh3ZHIzQ zzzznM08sGEVgnUyR-DatR-FG!m|tFG04Z*$XSXV4?{a6;aeU1>>kPv}whp(a;7s-m zl0SB=fQAuBH9VHUq15H})QZiN6H2?bBidPH4CmOM;X@^Y$;0Asqk9et`?YmpuQP>puN25nW)! z35o(xDS-%ZP|5(+(2#W19mfM2BQG)Ua$~!2qgV>!yf{P)f5$bbuaJ5Q-R{hb-8jKH z9NPA8e!~L|{A(Q0{LjNs!3-Uo`Dgo&p(_RBeS_RF|*9`5Mp z4{LV&$5?!$+0KTOp~QW`Bv8r4x#Jzw-e$WTPS7OFKR7>ylc7X<2QM?kqW@+ooZx}e z9g0v9upf@I8F2ppzhe(GsPDCyoh@LN8B+}7tji4cOyDwpmMPO(mRW)<1q{d7CU7%= zUD{mt&%Ru|JMJH7GC<0Wf#G=jEH?%Qu=5^64P<5j8F+#fYT$w%Zkxm+Zkwudb{0pS z#6>;a3wpS990S0Ko% zW(8Tx!o(J^ffLf-gqXNsGAOi6p$5l8&Ff`LWZ??{O?H5Krr_{suKU7J!V59&xZ4*7 zhSwLH?UFbdN-|z7`3aU}xu}=KxuY6t1W1yxlyyfd^K0fEolwF5W=YVn?t_Yem6dR8 zD25c2JElU#F-z-zvm_Z}7{NIOR8oRkKcHr89anEHW3SmE=ACSy%C7t3W46!BN`7cx z^y&=z)%@#!DbJ1*P%~eyVfbIhwSg7XG=j|Xxcyr&1ycR`zzQf62!pj$tht`!e~Cc1 zJBPI!8)znu&DxElBnvtifKvP)22TyKLZ^nnHO6swF3_+dN2fa*Xgb85W1$&mr`w-} zA)JfNIGgPpI2lS=7dvpimI7A|e?Vn1q-yxL(2TP??q8=n3#fJkH}V3(ZT(|xmYlFg z8A1Tuo&#}V9e_#P5Ef{vtUHbkG#@0>%N{U`gF%@I#0T}M`5Nq*N;$jS85i;Jz1+nB zE~i)=JK7lkA8TX!Z*{DV;Xf0&&#~h_bHFSfhGz_59;g}24&g&;YvBev9zKQ=_60nA zAk7VZjQ<$K>5N}623*UdXL%g6M0$1FDpspT!cO07)d#MGO-Qo7X zq3%CJiC&l6f6#d9e`v3^%YzZ5%!9Gy!Gh_aw9nb)z-V;PMxo@w28P#68$dw}DcS-9 zyW?28*gM?*cewonnN_9?Gpoz(-$tfOC%XLpZ)NB_2U6z2*l<$8=-}%sU2dSB=9^eZ zgCa0+VFM>C1Cxg;!#_})vw@S@jm6sSUl|*y#%thQ*Z@iu%x)};8#p&|UVhR1qrQlD z2R};ycsv}`xj{`Ii}wk4yZwPTub}OfG7d!3;@^TgoesBOU2$xn#w!cU7KVTqrT-U) za4y^@3?AbC%>bACcf!K$cezlP+iytV{5i(J@Xzgc>AfyDw(ht;9qvrsW&gTem^;}Q zhH!SeFoP-x(3~&C3D8jLcH>$chEk(14&nq=o!#!ti$ge%u}$G-*uZ$vH?Bg(2X797jXlM}`v4V{RWn^I@-7cDsFfS@9oK!4)yTi~;8zaGW&0VFG0{&;Y}K zvld~b5r(#Z|GGhw??3*RIDv+0__s1>pYZHF)?2^?8tj4$fIz0ZLBk{-9c>K%K^i*P z!KFhlTO|Wu0LaW)TnvJsbpephKd1rW_U}IfsEooK)%ew1_v?Qt7sx)yG&-F1qucFQ z2m5iiKMV}uXl>r_!^lvg`hU9*BdAH-&H(DTgM+?=b%!3yYf(_zcl-C>?a%A;VBu2k z9ZoEemc(n_Znq!ZacmvzopO74kF)LL1sVG9;^T{tkF>`ycDjA(ar^c^?n|@XK3;|r z^&OE=eV_zT1eybjhYIXSW(n9KzzA6+gIvb3fQoZ7P>&n$YY<}oiVLc-_fudA_ z|C)dOFJXa~Y>-L$?mDhs+b-}hg&g}Ikor&SO2Jj;1!$gXe8a^E?sKqp$FUt_XE@@< z)7kdzUr*bQf8B0eoo&DVu^n;aiDwJ=U&e*e=r8wcxm25`eYV3sQDCRR{cC$~?y!Tv)DA4I7k zOsU*H;cjvd(FW({|z9Vd9 zENt+`&;mX_P^nbp3N~S}0VlYV^k?A#-o*}_U2^<<;BJ5W72d^GoX6OVI5C=#AVJV9 zBdGSD1k><;`xRbjTm0WKHbFjye{B4GFC)RO1~s-peeT9L0*niU_`p*HEKFcef%82V zA~W-K$MJRfv;I5STh6+bp?BXu$bjMkL5Q1~U*>_PdJvW#;e|Im+P?gQhbtjn`PbpX z*6RXV4&ee?4iSvd)v)j5KhU)2MFvoFwC&SBXhXCLniC+FLT7Tp?a&?lP^n{WKmIX+ zN6f+frM6%H%jW@sH>WbrnrMynJfB(yPy4<)x z^_waKXmwBBpZ_Hy-EMzC6VB}5#a?Wk>>K{SX4(KsU8gue8KwD+LU$YssQ!Gy+v)ZM zTts%bJ?iD}^n0;|f%!zI-?JSI44rNtI^EuMy1nakd(}|)h@mW`JMKjnJC8z#+r#d- zXI=aaClxyU9)NnHOqUOIg+1KHV0;KP4B+S20b;%Dc6)XC z1W3uNe}0etyS@1D_w4nuZnqDHm%f)h=?weV?e=b`Dg$WXv@`5ix7!=2_@8dKR}jG; zpy~Ni*5ht}7#Tp-A&B{dk)hj-1yr6uyaXDC`@#zv90nIHoo?TbxjklRsC%qhoY)=r zt-I`3g9Sq=cSF7E|B`?m|Np;Ef{1o8fTrPl`I!%Px_tr-v(AE6-Xh@O*}}l=_Q|2s z?Mvt3ZuZxD|J)vTyZvBx`_<|8tNDj&(fsDTU#hQXLMH7y-Tqm-Jt<=Ac6*}f_U~mp zDE1DqfXDKi->@BV;{z3@JfOPZ6BDSz4<3mxWd%8=6toPXB&WIVA7e=xXmr!X;KHq9@m}$u&SSkSash#}K)C|E z%8%_eM|a$xG&g-CW1TSfUE5E*KdC zdfk4229ZGnd!RvNQ1wvvhoOWG>`$i+^I4a3lreXfbAVOw zS-Z29F@t)GaU93k|3iHY9UtdtuH#`Wk!r5vfm(gUjRTZg*q}E5c{zarG?xUj=Lfj4 z2&!nyYW|n;fZK#GW-&GY_zww_EU-crZFjy-(25K;P=J7jmyX17beH|>HR!J6>8|DL zj{DJT2_C+eV+W7kcgOJ@WB=dn_KVq_uhX5++8yL}cMh;&2)DcaVs!hb>Bjc54(0=J z$r9LH#|4foE>L7KFuaZewbtH3F*q&tqQ z+nonAitEqS>G#LdjiV^p(v1T=HWy&&#|AF1`S{S0WGDy09tuz>BdoR z2-DH+#};7i_h-ZZV(=VRm%qTbi(CgU+$iFQxLMnstJ9qiv|=cZ>zKR1|KJzv7~sCm z?{;HTt!L}lJ5Tck2DMHXrX36n&_-bM8xBzOlKsMs z;=pdu;O-xgVeT9q?A@R+{L$^t)9Lps_=wvNlvw%E16rrU(jE8he>oE*cLjsyR6x1J z+U-vXIDa#PjDq!&o8Rzs$FX(0vst^dlyG&qv4GoR2SAPaZctidD`9@Qi6Qt!)_+hr zQv_Da!srf)P|$J{cb+bPfeSZ_9YMJaJW?Ng#O)V~n|}4U{pogN3+OzIa8q~OCqxLc zb-IH~MK)-u$ObMIdBAQd2D{i4Y%LRL$rmVLd;@b?JS^S5mGgJUf!2W?0}b_kV=R8! z9mjUuosWS5>PK)cp5+Z1;$>h6m=(aVkPSR+69^Uqm6{+SL^~h5aPu2BaMtbywWV3g zm39g-et+0`xNEv7--TPnyuIxrd;!oVAc> zt)YTZ0i0#PIi;Ajv+UpNYu#@DK(cC}e$+n(1~40Bh^5;s4gcsEcgTe(If`JRFg(0K=CBjgTg620s zO=HjuEYc`yhZ{?m8w-302BOdDzgdZJuiIbfgePdetM0E9s8sz28O9H2uKULf8^gbF zqgVx`0cO!LwrXL91@#~Y$RA^?7iRcx)*$@yDMLfuUxi|}hPuDJr8ADP)d~N9?X;i@ zq{5vK0vz32tBj`;Z;v$ql?O*MWnn+pI`ft;>P2!|m^XwjyC0g<=*P-qIN_ zyTGz)UF>RB?ufq#GcuI0sQvQ?uXG0q_qsE&1?;G02msgeAQ6y7 z;3g@U)8)?i?*K?>3q$8IwPOy9ylS9som`%ed4)%th3dI}^ zKY2@-UzYvI1Q@_*#Tv zsxI6pmh5u71M*0R*FCT`Y5zOi?*4PT^Lj=@-Cf=i?k=~xiyDMM@$?_6@|e>-hF-sW za)ANea%IB3>;eDHDuh9LA(KQU!p(Li!v9M(b{vCtFM8eXL3;H&&Ok+WTwn>d@O=Mcw}Mo zzYe$W&~XQjE_NNJEew`!f54va^7|gp@RJwj-++dnkdOlfM8i*bXkEBbtlscbp_C2O z{w)#gF8kAbjH%1*dv_d12g85Rf^fDMz93s(&jqO{1E~NtJsK<&N?E~+_!rcH9Hs=W z?l?N!LGA)i-*(4wfJSb>t8l?d2t2b4UJBgp_5-x$!>joK6LyJlgA62tDY zAI-;@K&!Vb6iRu!%YHQ@BWN|J+mF}lxoK-k;s0P`xnTk|!l2goDM;)4#W{xKY!%>D_!XR-0i1FPg>;nkD+bXfpRAW6nh;oQqR9UwANX zU<%k#&k!)nmunO2j(04esTojzoQ3HXe-?Qm!Q&sN8|;{yw5 z!634#3Yh$&Htzpy6`bJd{pL4($JuIh7#NPT6@W;$e*%%m+&=$rv@6j0&rn>@Emxp( zti3^pVFv?KK(E_3xquf>K#d&Gv~_7vvt5l2Ln&Lg+mFRHIuNA-`V62+tuiqNhAy|y z7j6{ufqDq-heQ_^=r}AY()rI;pwsR4kCg$mkiho;-*WZ_yCR*a(!OJEpBY|vG}{&E z@E7y$_|6irBTN!9u(jj=|6aQyshteq9>?k(3=F+?B@#RTgQjslt%k^I!MO|!iz{>% zSLrOO(^*`mbBwKC=l`ru#Qvke<7^F_j0_tXw=f`uDagns&YcX5pgzrN=zfufZNeK_ zF27)8>kw{KYZK;YIKtK@%yuM>MXi%PO06@TsoRZ%k*!U5VVm&f7tCxO!r&^>+MTJ0 zb;p0unso+-Sjg%d&?qOU`i9M|*fW&a?PO)xC(hctkKsSa&L!YMOVFSsbm9ce2bDXZ zz6!Ww-)z?<%uvb(itR3NWe1+nnB~N!Wytc0XmNZ8kREa5{3_HwEg%Cnp1+#BF+2p7c{(qm{-~n%nF%R zYS_p0->Q@wI_}ib#t803wEg+p+4k#iN89(mkUd`AeSiL1pD6a|JlEC4_`iGKufHA5 zjQ{_){rcD0(`!4@puqr^+`x&LrfmE17qrT}d)|+~ z9q!DKP+|j3w7q7BhSj1T?wuSA`?3)U?^xTnKmVcj6*0d&%K$1ybxO4s261+RO zhTcAg|AEj&D+p&4!<+#M4sM2h6%a2Xf`bbsIJl96qZy(W92_`90g~i&yV|~iQl=`@ zMc5tF4s#4>10N#5j#Qfwmoj#vH->4tM-#447348o6ov_wWC_f`i&fy9tDB7Lq#$j>~I4~Z(*=@<0xXahHvrfas$n$ z!nV?U>*-ir|TONNoq%P00o7wuE-S z0Tr&`y;)_sjdlf)&BHrb19nV;`T@6vko<#UdbeBwCv+BB#1|~T<2oy7;2Jy=2QGa5 zIRCR1aK7$=THpLe2xIT^9oB#ylToa9`_fSN1+jPe8^lp=Utx<3LD7u7Gx;;Rz$Z{$ zfUM$uL*09ZQr3k5oUawT;@(5XbVYov*#bCASdX#wbN@#Y?R5JA+LHw-Dw-fWl^09_ z&1#!8+tqP86!Gr(z#6b)3e?S@wghNemlP{bp|Oy4=2O z1n-~z0PJdj13d6{nJ+&yWGC0fc8&UbV0T!|A+3M{tw?j4O?en*%kK*>?im} zYH%|*prM8d(hGxhEWu0cOyCuW+n?9RL7O(}nHWp-!E?AM7QGh25MzQZ#`psX51WN$ zoZu;KcF_K)ZoUxC&K?;Tm}A;Se8B^woLz2TI^1~{x^Z^8^LDwt>u~4(&j!{A-k1Fm z;!hFK;QFqQH^jMY5_WJ>e=Pzo#6UaR;cI37Ktn&ctL^JQ(B5;KNM->~S zw+vp?2ktXA@B8tOq2zFP+Yiv(+wry^{}>ovAAv^zbR&OR3?$;Q1rJ)N;M>K&8SIn| z97t`ZfB#<3h1qEKPhSB8^}uO%Dm{x_BiFPH{dXT}9~ zC|EzVq6yr=$N=4FUBC%;9r_0AGFH&u<$|(G5Cz&Q9sl!nE{NSwA_}75JEkK*ye8Pr zYA+BEw13+2&ucpn8?ECN35F5UiS_Q(fLmd}msUcXh3by+mBsqTxX!~*dCT{SG3D7iK=V8!R z_U<^APWIQP4Ru^hrAlCJMabIP`NF%)*gC-TlnM^7FM<~nFm%VUfF^}v4}s?!n%{7M z1G2;IcbD65aN9<%EAID3mP@Z29y4!e=xSd8YPGuk>uR6F-Qo7@wL+I0NcM#adxzUE z8>VsraMJtF04W&2`$B)KaM&=Eh1AIF?@afEU~T{V)6ZzYH`*+shsR=`y}p_zz?f ziw#3554f;^1P(jYyPz>AsE7HW9{%3t_Fcun1~jMsgrV2%E2wiH06H}QGy(nM(Z7be zuMDMZU2fkx+`dB3K;Vr4oj4NrZ979(Kj;vIFQ7f;;P^P*-7n_dc~~1n`u%A9$skb1 z1)0nYc=436+wI3j7SOWeU)^qh7~Ot>$F45iD26LJ#Mtfj51YhF#s<4qZiZ6lF1OE% zT0y6hEOz1CF$-FRbjh`HL&|r=$pt&MKqdd1xp2bvkb;XDSS||ea%0=bbO{`Ve<8#6 z;ud~?%k@Cj$PT2ad@X}60@KOd;r6%7jZKBQ!;KAMf@qi9U+`+Vj`lg+-ERLn+81!Y z7DfopfC#SR2E_z;kh=K|2V?;jD zJ3oZF%Q&>nd^kaC@8n`QI~ZQugXi?S+J*c(+=feqFQSgJ6Kd95~Td&)zfL^!P(1iLS;DzO%uDI8rj0#GeZyV}fF_iFi z#l3=wym`%X%O}~j-1rrb)JBv>`%;~-1@7r?j3_b zF)L``lkI=mj~6fhb%W;k|8%*%>2P}sNh-x)LwUQv$CF%q+~xM>H8+Cu7Q>2ew|7uG zAf|ILgGN?=6oW13_}5U!!B{HL?e>Y;?FVRE`-$e4OrSksaK2}!-yiT=v|rtE->;A8>mTW(|n9n|!%%k4in`$96|e^4g;(-rp*>Yc@GpiU}( zzy^lb98lK(fER3kUa$XO_P5LJ4`{Q`|9}@=e_zi-2r#^Uo6AwG%F151w(cz zXmp#^a9(@{+NdWN#o5WQu!hrNaSf*}14|L_jwfsZI~<@bAL#A`m~yUeOyz&r0(Ll} zDsO%RTGid{#sONO25!QEma}#HaWp>s&j?yc@(;9#+>H%QnhhrXr@?M2H>d=E3R>z3 z-fa!qIM(6z0@M+R2UTF;g8DgRBbt!^R))^gR_#LmWvm zZXdeczJNBCyyWxasQazSvuW5fp(x=U{K`;EerywdC(pA2Q2drv~LJ1^TyKc zLupMn=meE_zHl6Tzo-fYu;%m;LE=Ve54J(dEKw;m%sl)(tu+inYV- zWkcOdhBBS*xL=T!Mz6c$esn=r8ojbQSiYvq?X{KLt0F1LoWei9m#@!3w06h+v2tg9 zDgGa_&WQ!IoFx#n3m0_!)PEa>5~;4Z|DZGmX?gH4y0gIB!=Q;r=<2Gl4Gf^Qv25Mk zr5fPU@CS6Ang~0jB@9}3RN@30Ft_0Z&y&1<0_v{Fb%V=S)Sk+pX1f$lhEi@w2N1Ne zm2+VVsB_xs&b$D8HcHqI19s3s2cRJnaO)qmaO)4a+qa2%BP+Du2kF=<9&_i>S?I^v z>CV}0R>pbp*}@Rc&K4P$g=L%_?(E3D*SE*qzCuod@cRlqtYQX3=jn$1yb%l~%r9FQ za2y)bP|w3qlD?pY``>{@E!^NnLq|Jr1n3wV7tT(%fBz15#C`5^`wUu7S;kpx3ppL< zFxb=31<;_0dC)0noYrptO2xqj3L*^ryqy7L;6Jy|uXp@&`&z>MGUESnwk%Et1~eC! z%R!x6D)65TT)Tpu1kwDp^eUw0l>>R*?E{JmxA$FfA0XBoV_PE3uwaQWr~)om1(nO4 zhj%hCbb=Z={Suy?{Zj5-a!Z7_Gj#L|2K-}NB3ycD14D1!s+|s?M*gQ&$J|~qgX?u| zwk*y?E!=2sECa27gdDH2Xo)Z)NZ}n-(1L4F2$Tvzthx9Y9FokSlhr`^+nuAs?GxxM zI#BLz*uROJp+o?Bsseb==@Q{Go-R=1?Gwm9o4C8&K3TD~ahGy~{N(nrjJd<@BiJ0C zjjREnqV-FJij0j&Da$dpFU(zTUm&(xwF?H6v2?Tx20-|rR)!5ji6m%NwV`SiLn(ik z+ZQXhS7q$SoK`V*xV-|$J7@|>&I!C~tjnDnqO+r2$RFVcDR)Q=zWE19%97v;0#bav z1No@S?-eLuU$ZS};qGvI2dc(FF~SIT{kw9|kq(E!rv;Vr|1W#9;eWu3#~`^5w>O}; zczpwGY!UNI9>!yCuNgtZ;$42PLCLwCxAPom$i`{aKeyMV&${B?LGrbfJ7`3vUCNz- z0d5iKj3i@_Yrr;@D1m$r^7;RwRUjJ+86jSS33o)T0$E;q1ZF5`;6%#3%kAC21B;dj zgPacD3S7qM0MQr#HWxgy1sTs`1L=Q#4XUy{0Nw2Zo##MyGX%W&$^dfyV~|hW-oVsj z36-;;Gz<%s>yVW10UOw9mvU!rm+)*pzz>?~VuqaU)aCY}ORkL@l4`o$zUeXuK*s?= zNe`SqVDY=41vJZvma@yGJ5R%oi@Nx*yIsPw^E6|-oYOzIucbF2xp|2&Qag9S65%Zj z)(4AuI}aag7xHHS2f_VgY(oAFy=*K@eDKpupiTJZH$0Hg>uMJa0C!K=U@;h=%Fh7u zP^a6!sEsU_UolS?^9F72`XNxn@!#!NW7mFvUSF2WGc#oo?S2ED;8s1X%VBJc$fy zd4uaX(BXb18b{=o3HQ1)vIX?9tpKg_04j-V5p1Olq;(|r z-;d`=90z#q3aG`-$QHr*-;JZ&jR$n@6lhs0Lzys0K{q={s@aW$>A&B<*U!7%ctFc@ zKr*0)CrA!dg@QY%jc?>Qj=Q}BZ;1mr9(;%vN2lAr#x#!qjG%RC<;*W_Kzjg~-MDNS zILg>TwJ67H&TcmjW;d=*w;#~Z*vY^IUiIttrMv81Z`b4Rf&a^R{+E3VnB~E-i4}A* zO4H--oo>H+;{JfnggVyg_T#u42LnSx9S>899mInI|I2cSqY{xIJRt+I=Vfd3N@l_}4vM!c%+NsejFf1Ujdk0_DzE%+pT%>zsDt zUw7Lna0YDyIZ4W$vF#KjBVM>s%+}a;;va(mNCh}Qx1IP0axsVx%F-YmZ72S1WCgWs zuXKZ$pn?Hp-hakUw`-kl4?wZN0S>SKZdV%i9sS2p!r5GR1=Kp9&kPP_cB>NM1wGsy zZD;=-YdiPP>R8*Ee@w4gK@bZR7cj?s>@ z+0Kshf2l0Q8qOWD>;XFh8D6vRC}a=V5d`hN9Cy24*e@-KkoK|f#G#h*StgEUK&W1cH4=69^epem+;hXJN2*mfIufG zl-o&-m*xZfmtQc0;>+#D!W_;{w^v>BjzaB`a_e+^(gki?gGa3Tj{O4-S#_T723HGj zy2VmBnWsy5c80w>?)HI!q1*3Lr{A~kuq&Nmk1jsA_yE)eyQTV{aVGs&T zGWQ0i0MIB5Xh3ko|A7D7j{bY`?-$JN&HJU?K&RKVu?Os6$P54a?wz=*O zLzy_p67Z63$WbpZjDP+2yYu>S*SsT8ze{*R!c)u}6wF<1NB(s{vz=Aj;eTb!FAp$) z^Ip497o0M$NR4C~qS`sCOcdM@2l9XPAlA=Vi$h+EMjfU`!|sh)IV*n*X?loYxBQU0Maf1Z-NDF_|WKz z`wQyAH|T)&#tMLX=0}7<+t69N-TuAi0uOjFy8U~-4piuamv#pRZusA8SFgKsB6zLS zs$*_{85S1kcy#&w1vid$KwXjs9k2sSq`-%R9uWq$b*=w*f{s1>+a33>qrG1DpWENk zY;A3+@ zE-n+ZcKcTj>LGTy{ajS1^Uv+)>yuq_bvmHK;~I1rO7g*mEiBUMaQoR2_XBET0kVl5 zZa;9D*x~jAVj}3IovwBP{R=mW#b0cLoV)|&vj=Zr40ut@xS&qQ%I!x<-Eq(fIbCi) zwlILQIWt?04(Moau#-T$unviWm#cT)V>?p!YbOI^lw9AfKcAM$Lmb`J-k<|M#is+r zfNBC82AW4dBHVebv*(C#cYm2!XHS_JOpky*RF8l@L4iu^k;Pq<@>U5y9RLyVL z78dAqxcxom_6KsFL_^(Q=mPApe_eimwlXkZ3~2r(0B$CNo0&z-FPj;<-2VPM(cuPK z&UCn|zd@(N?{~vbh7xs9nRxMW=eh1JMOxkcM}(O_UVPTPr%395DNpBNPym640A(9M zJ8wAumw`6>zVKjxr7e&nUUPQ2{q1o3_0R23L*1Wx*p}cIN+_ychW|$~g9ViF4uj7G zmswD+176F2k^!`0kD;NCMXn6Az<&$F;u4+LY{%J3bmSNomgqoEE%^dsflo5|)XTPj zT@Jk0W5)sL!Wu|rxA>4Sk{qap18tXDd`P(2?vOBO70q(?fE@>*H5zzz6#Og=SMbmc z?39-y?9drY&=D{!j$1$jSfEn7*X;w!ww@0={zFwlPF(@#imv$$I-u5Cmm3?XQPe%Z zNUQT$cgqoB=ED~sfabA^q(Iy5e*7;@U04QAWNs{57#P{gbQYHAEH2UM0&&3^4|Mtr zcpUc~X!BEs&qR0%fwzJ z{9aV2)8+OYIcL9uga9r#Ef}=Y4ZI=2mVv26 zzT54MHQOQKQqCO#905CyFuZ2pQOpsr<0#Z)3#)V-7FX$jTHMSpCo>#(`vaUk5oz;YU|{y)JU%e|OyN4FkjfG9E~k21@g9plSXUB+WOv@h~v` zcjNf)$M$+2%yu^pP?9U-+;JRgb$8qsq$KqXy4l}0&p?@3&aAK zMt_dG{bOYK@5lDvjRWKx@Xijn*?!*~11$TCq`;#o;F_&i5!tKL!1nU}cl!r1;lJCr z*E=Ca7Un)LkT}eRY{A`b|DdHAXscWRj0-BuICq?Yc@nCK(T(TjB+y=$Q{Yhx@X!Ky zTPtYcBIrB42w)_JhIjH}yjpD=iZ@xlYbjBZ@7PeC<9XYWAg1+|w*EUeJ!Y%kJc25r^SX{h7) zUd##_7~$P9jU!;kNobyd9T2ymUI$#88-Y9z?-au8&{>dCAMn^s2`BgnYS4WnpgI}6 zKoorJ91GaZ9H7~8$WBVo7AkNG4n*E~CX2N3?AxUaw~E<7ThCr|g7=)=-tiw~AgJ~a z4D1G-%_MlFjIGO$Wh;Xmn;c{-DY%9KZ64t|<{-$>(JlZw#RIZ%1GLE&w3OsX98WLk zC{NI0e%N82oo=B0oGe8)y=MD3j@0q&WMTM&wl)WJ=|Hd9A)K-tj4up8&0SC;X4~=q z|I2K~|7HJn%(j2l9EeUm6WpXU}Sim-{r<};YKm&ZV&JboM6DL0)~ZbulfI%fhOL1-30?? zsWB`Bu{+uY!JBoNU!M5a9ry3JI}-!LF?YuQU=xajKpDCewBir6)%7)dcig{Y?gF6Q zkKlu>xH{c=I@mjJfC@zL099b%5jQSSkaK`GL4XRweug;E6fGnVfe$+@6+aTkfh7&F zy~z99>Gsd|KLcnxGsA0ja0EhjL%-+%^;g#$j?hv$jwhF z%}M3uV&LWS$;?Yt$SciFN-Zi@NXsu$VDL~-U|>~Ha7-#@RZ#FR%VAYe2ucO96+nPN zL4$#pOCh)LFEKY2qzDZ==Oh+`+{G1?TAZ1ZnpeWh z#lYoXmRgjPSP8O^!2?7pfXwwT%1qD9Q&3QF2YH5EQmkNRYHDn%kW^WcS`1R*Us|G&pQcb;keHmR zke{cJlUZD%kd_IKMJ8S@2A9wPg`(8t{Gt?vlKgyyh2G6{L(h>!?%$!s! z1qOwJ{9+Il1W_1LSpX7sPRz^8FHy)ZNX-MA2+~xRn3I_TN)Ne-5Ni||9P<=1^PuS| zEip5vv?x^}Be7T^KRLOyC^ZG-Nay^NRE5l91qP^*X_=;1F666()VofUrP<%ron!zPl!7(Q%KRK}^Ge1v3fx#y~F(orE zUBM$WJwrhO8fZu=Y!w(F0mk5%lwVq+P?E2Zo|>0hlvt9gpywLl3U&%F7lSjxEyXAf z;pGa=D@rZS&nZhyQE-K3o?snmk}xR5l^B$Gxfne2 zAaM`T0*Y0JIgIv9$T14>TBQPmD=0lEV6dWJ%7YHof}B`9So>YRp1$hOYDq!WdLVl4#GN@Qg z1r>}e&i*d07;2Eq_IyZb2@bwsNZF58T$p$xtH-Ph3czJ1&YA$4lu}aDGV@YX6ms*6 zQWZ)v5<&GvGN_P%1EYHaVjM3QgJTKEDsZWnn4Ao%E>jXq5*6}G zOF)$_FBhoxfToP{Iq%ORXpXmt6{}c`3U2X}X|t7*xN&jm515oB=9%xfozE zk5YfZi=+HB1)t2kY*4xD?`P!~>SN{X@23aKUC#b~41S?Lpn6{c>55KhMh0n0Em8xt@&y-cd&BT=H_k-S&XXh8@Id01=~jGz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU T1V%$(Gz3ONU^D~3}S+%3}S*+3}S+7 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 GjSm1;BhBOh 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 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

    ;>y?s&jy66ShlZq$% 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 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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 literal 0 HcmV?d00001 diff --git a/v2.0/bin/PROHST.PAS b/v2.0/bin/PROHST.PAS new file mode 100644 index 0000000..4ee13fc --- /dev/null +++ b/v2.0/bin/PROHST.PAS @@ -0,0 +1,403 @@ +PROGRAM prohst(input,output); +{$debug- $line- $symtab+} + +{**********************************************************************} +{* *} +{* prohst *} +{* *} +{* This program produces a histogram from the profile file produced *} +{* by the MS-DOS profile utility. It optionally reads the map file *} +{* generated when the program being profiled was linked, and writes *} +{* either the module address or, if available, the line number as *} +{* a prefix to the line of the graph which describes a particular *} +{* bucket. *} +{* *} +{* After using filbm (derived from the Pascal and Fortran front end *} +{* command scanner) to parse its parameters, prohst opens the map *} +{* file if specified, searches for the heading line, and then reads *} +{* the lines giving the names and positions of the modules. It builds *} +{* a linked list of module names and start addresses. *} +{* *} +{* It then reads the bucket file header and and bucket array elements *} +{* into a variable created on the heap. It simultaneously calculates *} +{* a normalization factor. It writes the profile listing header and *} +{* starts to write the profile lines. For each bucket, the address *} +{* is calculated. The first entry in the address/name linked list *} +{* is the lowest addressed module. This is initially the 'current' *} +{* module. The bucket address is compared with the current module *} +{* address. When it becomes the greater, the module name is written *} +{* to the listing and the next entry in the address/name list becomes *} +{* the current module. If line numbers are available, the bucket *} +{* address is also compared to the current line/address. This is *} +{* read and calculated directly from the file. Since there may be *} +{* more than one line per bucket, several entries may be read until *} +{* the addresses compare within the span of addresses encompassed by *} +{* a bucket (its 'width'). Note that the idiosyncracies of Pascal i/o *} +{* make it necessary to continually check for the end of the map file *} +{* and the complexity of this code is mainly due to an attempt to *} +{* make it reasonably resilient to changes in the format of the map *} +{* file. *} +{* *} +{**********************************************************************} + + +CONST + max_file = 32; + + +TYPE + filenam = LSTRING (max_file); + sets = SET OF 0..31; + address_pointer = ^address_record; + address_record = RECORD + next: address_pointer; + name: STRING (15); + address: WORD; + END; + + + + + +VAR + + i: INTEGER; + bucket: FILE OF WORD; + hist: TEXT; + map: TEXT; + + first_address, + this_address: address_pointer; + current_base: WORD; + bucket_name, + hist_name, + map_name: filenam; + + switches: sets; + + line: LSTRING (100); + + map_avail: BOOLEAN; + line_nos_avail: BOOLEAN; + + norm: REAL; + per_cent: INTEGER; + real_bucket, + norm_bucket: REAL; + cum_per_cent, + real_per_cent: REAL; + + bucket_num, + clock_grain, + bucket_size, + prog_low_pa, + prog_high_pa, + dos_pa, + hit_io, + hit_dos, + hit_high: WORD; + + seg, + offset, + parcel: WORD; + + address: WORD; + new_line_no, + line_no: WORD; + + dummy : LSTRING (8); + name: LSTRING (20); + line_no_part: LSTRING (17); + start: LSTRING (6); + + buckets: ^SUPER ARRAY [1 .. *] OF REAL; + + this_bucket: WORD; + +LABEL 1; + + +PROCEDURE filbm (VAR prffil, hstfil, mapfil: filenam; + VAR switches: sets); EXTERN; + +FUNCTION realword (w: WORD): REAL; +BEGIN + IF ORD (w) < 0 THEN BEGIN + realword := FLOAT (maxint) + FLOAT (ORD (w - maxint)); + END + ELSE BEGIN + realword := FLOAT (ORD(w)); + END {IF}; +END {realword}; + + + +PROCEDURE skip_spaces; +BEGIN + WHILE NOT eof(map) AND THEN map^ = ' ' DO BEGIN + get (map); + END {WHILE}; +END {skip_spaces}; + + +FUNCTION hex_char (ch: CHAR): WORD; +BEGIN + IF ch >= '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 zcmebD3vmtdbMy)3xxutw>HSC{a*I$t+4u zF3B&-Of6PWNGvEwO)OGSD9nRGMB5Nq|OL1yqQE~<(rWF(d5=$~5WlvtdLSj*R zX)Y)U6@XJU!Y81_3QJxvo#4_)0hBm%QWX@e6%>k7ONtf1qEMv>{UA4ik{7Z$h~Ul7 z$*a^;P*4cTNL5hCFUd$PQUC>cEnJEBCzck23iP7XlG36)g#MCzaF}G~mE~ur7J)KXNJykY zN@^KG2`mSL6)F^$q-5qnk}!y!Us|F7&dIO{1O+5WB|<;k@gQR}lT-CTb&-=}h_i=+ zufL0{LU2eZC|&Y$xjK9JBPCT(ddW>KE>28Gs&-uS5|eULK~f6Er3D2=sl~+#smU4n zpe&J}1`7&>oXot`VjYk&aAH9?1{9`HLlyG#6pBj{^HLIvQWWw_OA1O$^mw`4{X_f} zauSnLa}b)G^YcnF^GZ_{oIu$@A+;hkxfGm35=%f{Re)OyP53bV!5*G&NO2XMk(mb3 zkOVdd7VpIh3aSPQ3OV`3B{~WUs)o9Dssa3VEsJpq!v{sn?dKm7tDxZ;6yzV|;~M7bqmWml;2Pl>91^ThqX4O;4Hax{p-dx9m}3#`z*Q@#7E*BZ3-$yh_kx1_q7qOB$j?)7_V+{hFu$}!6O`&) zBOnbT1!sR>Uq?R|aKp&WKgib+DVp5!i*gf7iWO2ai?fSCHJi6fus6aiXHYo_l~qts z@XIe(P*5n%OGzyPC#GVQx}mtFs5H5xvjL4{Jjf2<0gDIq@XIfEyE~xlSRZwtq3;~xo2#bpgOH)&;Qi~Om5>ph4!R^&zP#y*q zMd0+v%M}ph>4y}nAb)1&r6uNq!Xha#IXk^5zcepJ0i+rf{F$IEp01!!T9TQQSyHK> zP@a*QoPn@0Ek8e}SfMh%R6!vV6F1fjnu z6`TW-6Z6zT$=l7-$JrmLQR$IbtdN&qqL2)3E~O|WDkOn)yGFRWc}5^iam%boEmqKT zjc^4!yckpyfeNwYYz2kHoSgjRL{J9S0f!c-SjsC)EdnJASVq!w_V!GA2M@TJ~m;-hnB={A;P5hL6kl#SnX%VOn&refOD9;CFxct&$gk|6$FIFhe zNQHJqAjvSZSRpAtzXV)$2Kxtv=qNaQ26(sz=_t6l2e}65DERsZAvLz$GIL5&i;5LA gN)mIjL3Nq4N04W5063geQcDsubBZ;2xfqB806e?i$^ZZW 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 zcmaF)oG~o5s93>J&(wec3iKKDp{$`x?F!@E!g*HlaIo=#?i<}Nb}BGje0K5r)EE8? zQzyUhVwfz#@aWx60f|X3R2U||;9}@L`ht}q>c#2*hXcBiTry6$HLuV(7Zo z@QA;J$>`+2vr1_6D%17lVzA&%%{rFu#x5RBkn_;3{eq>RT)0K{?aXWf^)%9&P7K! z7YH+U^Bv>d{e<)Iix>Z2>|trPJHW|M%F-!zfU~)t@qft+=8OOMj&PPf=@vV{$$hEh z=8G9DhhOad9}pZE^rDC*Dl$3(s^ab87hnFplwt|kVsKWm?SU-=Q!&S`EgUcI|2wM? zVe`L4VqXKp8m!xrANid!VlDlQUY+#SQv#s2Sv z&Hqy71wxFAgc%vw*f|;4_&Ii+;dn9m-xi(?jAs>X#7pgWg)_hIbA~vUM}Cv6daHV-sPFImRZ&7_+aDVSfap@kxjac}tmJ?q^u#2;#BW@Roi(#>(KoK!ow{r*(fy zm|sq1c+A>hYgNj6j7@-%(R~BMs)+DoY=Vr8U1Bi|T$f4&{+-&wcUIBne<|CpGR~I| z|80>+@Gk#ru9smb;p_g~d`xb?IOCdCTn9>j@yR#X2{1D55@9T1-W9>P#rmw`t}@PI z=9f$U?NBj2tJo>W!`Q>d$GAgTbr&Q1S;ZYHs=Kt<&noh<$L)_{*ukiIRxu!AcML;A zJ)=S?UxPhEDd(<8&KI$NUp6qwb%_Zx{yVhA=&WM5J5!fGi_u$0y-vO}oZlaI=W}<5 z3v`#Wb@}sm*YkGeb9BdZ%6H0L;OsOz!P%*IiL+De3TFr3G0slA2b>*xM>!W?17q)h~Acg<4+1{E~qYq~bW+DNZJag{L@Qc>Znt{hz;t`Q>tk<7{_0 z85oYU-Q#3n=oWjxx%eFC4kiXhzB`=FV)r;1Uda8mmOIB;%DVU*=j&$<)`#le{%1SH zx$pv~CEFp+@``=SIsdUV*jU!F9b+-@d;NKf)>*~ImwVWmzQN#yi(H>N%yw{g@a^Q> zqH|X9!aJsuAb8;_(@6;C`q*K%jk7~0~u`8V2e3v-2Pj$;Z;(U?8_~Og& z-8!7zW`{V9|G)U~`z1T$t{8?b{AU&a9Vq48HIehh_1`Z)GaP4oz{$w4KZc>(RbcTQ z&c!!4yIqAA-{V|-i?iERlKa5oQ=FxsAZoNb#rdDVXl7A^ZM!v)uzu#!@~|0GBcu-|mc+e9bwb`|`pEoG;%0UU-Ug*LVIG z&wekw#@TFli<6<0(~|85XF2o28=RW10?n~P44P~=IGg2ea56NcO6*_wfb+HNgoW2Q zA)>c98HzcK4=la`a^u2NoQofDzNr1(DR+wVW#oU57X{8LzWDL0yHudNR%o{)=Zi1D zy3OuzcH7k7+YgWZOwjA;Xp(Ua~U7oT@ey~+N< z_Sdez>@UoJbzgg7^lKL@#|xcbyM#GjsQuc($a7XP;Dyw$2p$ES%o1*!q7qJ<#L`DE z4gYf;V2=mce^`sdg2R!+n^C8^0J zDo%+h3Z;3OB`SXTB?=%DE5Sm^`MJ4?c_}I`i6w~;fyA5~g|z&l+{6-<;MCM?6~FvE zT^Ijgg_O+VY?a{D`R!UM>}0u7IM{;$nrwyh?@a)Jlbte1)Xc^vpbkqSWO4 zvecqVh5R&70nE#lmYI{PQLL$up9k}|l>#pp*og4NqC8M|=qjXSg6zmIs#HiT&B@{A zQc-|ugPNC`0uszmQ&3Szsw_z@hS>ua_slCx%*jkq$SciFN-YA}T##6lmj oK+i7%o2-zRn47BNmYI`^6d-P%KCT7^1_nW{&SW-5o+vT^0F&xLAOHXW literal 0 HcmV?d00001 diff --git a/v2.0/bin/SORT.EXE b/v2.0/bin/SORT.EXE new file mode 100644 index 0000000000000000000000000000000000000000..9e2c19a5e7817ae5d8731a487e04f4ce0ba7285c GIT binary patch literal 1216 zcmeZ`I>f-tz|5e)z{tSJpvI8EFtwI}fq_8*MDQ^%@Gvki9AaQ#c+LnC7{$Xa1hyEQ zRcw1;%fM7DxJ#a)@769JhAo_D71@jr1f1StzJcMaqF#sCZ^nI%3~Ow7OPp=AOBD62 z*nTsXegN@}ZL~`SZGuWzY>Gm6e&V=S8R`q>&AgQ7<^mgV^ZF)?WR|ccEyO|ia zIGk17;&WE9`$qSP4N{-hY2R#q&D3DeTf*6Vn5n^Ds)W(G`?cM1HwFfVKf4(i_cJkW z;O#!EectiYy6)p1+J`&YyYG9uKW2LU;y614L-S##?$`Sn7`yLxe{QyCC}n=x$-r#V z&BA@4#33xa`?sDp+fT-FwtWl?I~W+dMfJ4BK-~Qd47(T@yH8jjDq`wBrN?adlTnY^ z>?h;rW$|&POxA~r_jKQTy`%fH_4g99ZjrF?zaR&6fA#DB$NcN_l0Wfr;mn`Hx=(#x z5*HudeU|x@_BqFkFT4LSfBL*M-tM^DKL!S7+n3q@LGI#Z{@KlYoRycW`6ol^XHZa` zZGOq5eQGx&I3$W#tPhs(g9E9HFO^}J8^g;R|3JaRz@Q)O9~5Gx;F*`4UsRNuT%zFO zAFNQ8T2!2wpU2Ck0+TH+O-sv6&P>fKQOHfr%`d9t<&wrCmy%hWtx#N$n4HSXB~QOx F0suqW`i1}i 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 zcmaFO8J1d9tYD~TZWyq|;H+ZX16wo3B34@lrZR3m`CV1aTR6`uo>ho=t+Z<$^UL21 zyCyNe{K~N4Efb5wqC3pH4uIu%aPXW}G&;~=7t5efdfn!K$;}447zT!tOIsw*D*ijL z=q-~4TMR?V;jRlT4vSVXEn3F3Z!Oan_p^$-mN9LyKC8Hef7d&vvx-~?N|)_YVBW$H zX3pLswJRv(tl|zvhQ-Xxi%pq#zhm0T(D0(2VOJ2#7OAs}yA_ysG6cLRXIK!!ut=SG z(O0HLk<2U(i8?6PM8d4AU_up7@RfH-FrcKv65{bH9I%j?Hm)VnXARqXUP z=ysRxbl2&2m+f@dJG_M-B+7N5^jf#OxbY?CgC5^M26Vd{Fdy_VzV!WLl=Y#*AjfxK z-XeBZ(fB~8yGEzGmP4nz=oXD`e}l7%HjE{6y4`g;-KD$T^*Y^Uw+Nh7Jj`IF&j7{@ zl!5Z6{V)A002Mw3pfA( 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^E9UK`P;_4d@;%=J3&Y+RUz{JdWbU_gVBLf33 zS7=^QYI1&hUS?Hlib8UJZf;^;ib7_dg0sJ$o2R>8aAYtqmkKXeaB6Z%evv|PW>u;} zNq)XUPGV7dDo9;gW=^Vt3NM#aVv0h3kwR`}adBo|x`K)`)F{uqlGLJtqSTVqB8Jlw zco`TN*_<3*oc(>H7#LzE@GvkivN}1s__%m5Fzkm*`v>?kFfgoy^MgI3)EO8mAj+MC leB69h7#NOC;A3E5WDkxE4)%<4&0}EL)WyWWP{J^9003G!MF9W+ literal 0 HcmV?d00001 diff --git a/v2.0/bin/SYSINIT.DOC b/v2.0/bin/SYSINIT.DOC new file mode 100644 index 0000000000000000000000000000000000000000..fa20d0832dbc4f6424db88f22f4f485e7dde36f0 GIT binary patch literal 3072 zcmY#TP*4bt4EFT%3{l7|R!~S($jwhF%}G_r$;``6O;Jcn&B)A4Q7FksRq%K9RY=Or zFV<5~@GMa%Nz6_y=H<#SOD$3WODhyt7MG;vDkx;;WtL5GK&?8QgiZ?6H8K4^b{0e4hF@DLT+hs zi9&H|i9!j;lCs2{(o{W=ogn+&JpCMfFkGdefaxx{vp}H+b5tINn;`KCO*Fh*x%p+O z#R{1vq`1k&HO$l5HQvWFI0WQGICepCltM~=DLA$up;nNenFmfuUOf*2^Sg*Xx(hTtevfQB9@N)>_}eH9c65{nYkixLYm zKo0N(M>H=NI1W?tQ;YM|A<+nS1tQtO)2o6)d1g+IfY-ssgB(Ey_$uNzGG8ssyVp zElw>`$jpQK!P(!>&C^{kI5Jp4AuTfpl>0qPK(2OiN=*S3ghn8>&^!x@nBt85(i~9n zu8>}onh44$B^il%3Wjj+xq14yVtP(NfjIAh6FkTvH1?hX*nc1oDp(--P)7kAdc_Jk zsl~+#V4s;PB!UXk^t}8cq)3E?2uchpC@8o&20@ZxszPdBNl~SO0=Uot6)w;ahwID* z*Oz(<;F1KCZNQaJu|i2cFINeuIL=8-O3hJ71g9v4)Vvf>*kqOzD}d|VBB*!+)eZP7p@Pz+oXli+6%^ze4>lBJ7BYtWCbJlnCKB_Yo`U$PJR>tX zLm?4V*@40;RRQdYl6-}fe1+ot+*GhbdAZ8-i?UHGb5I2ZG7(nagX<+nA0LGvS9j0g z5K!ju4Gj)aaB}743J7uyb`1)1bpZtw%zl?(NU(we3!JDSc{s5wF*65TPeaNiUM>wt zodZ_m;vcN3r=Z{xY-NC?J5j;Vz`#Qxsj?(hp`a)~y(lqPAtN<0CAEl`tDq<~Ewe%a z;?JVgf}+&o)VvZ{2rEIAD=8=>mlhSJ=9T1BDkv0{=H+GPrR(u>fr}!znF`R11Im;N zB^mjp=^5ZEM?nD=WuOQIhhSn}3NIHdnSh#0c?u=@>8T|dsYTFC4vLJt{1Q;BOCc}6 zC^s=j0bx;Q9w_}Jf|>>Su%cE0qyrpP;AQ|Q-Dj5Qfbuh_bpUZPC>x{|rKa+7K|)WD zmkU%M1Y1GUn1UlDA(mw3rb4QjqWsd5%)C^P(V+SyH3i-v%uh}(Eyzp-rwU%KjLh_m z)Z!8aLj!M65{8(rprHg6R{|N3l3J2ll$)6cYB@s6DM(J_<$^Y9kgHNyb4*i5!Np&} z&p!l2g$H?txCSePc(?|+>Oq|xoSBylb!=v_0@RU?ZXvEg3Yck7N1-ymR3SMrkC!Vq zF*_An3xail>RfPiCgv39D`e&tWDoZjz&C!(nyi|oOlqO$EJ|r*jawV21B!Y@Bg&@}u Vh0MI-lA_XNP&-_Ymx}=l006b_uABe> 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 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 X5T`+VGYkw2>Rn6>3?-n32|5M 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. + +: