summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2009-03-13 16:02:51 -0700
committerH. Peter Anvin <hpa@zytor.com>2009-03-13 16:02:51 -0700
commit22018cf7b1d7f1caeaa97e1f0ea2327d1aa3e491 (patch)
treebe820145b766bd547d4957b4f1ef455c1a6430fc
parenta99cf1d4afc3a362d6ad54b36247ea33b58c8497 (diff)
downloadnasmbuild-22018cf7b1d7f1caeaa97e1f0ea2327d1aa3e491.tar.gz
nasmbuild-22018cf7b1d7f1caeaa97e1f0ea2327d1aa3e491.tar.xz
nasmbuild-22018cf7b1d7f1caeaa97e1f0ea2327d1aa3e491.zip
cwsdpmi upgrade
-rw-r--r--cwsdpmi/bin/cwsdpmi.doc346
-rw-r--r--cwsdpmi/bin/cwsdpmi.exebin20125 -> 20125 bytes
-rw-r--r--cwsdpmi/bin/cwsdstub.exebin21504 -> 21504 bytes
-rw-r--r--cwsdpmi/bin/cwsparam.doc204
-rw-r--r--cwsdpmi/bin/mswitch.asm536
-rw-r--r--cwsdpmi/bin/readme.upd11
-rw-r--r--cwsdpmi/manifest/csdpmi5b.mft16
-rw-r--r--cwsdpmi/manifest/csdpmi5b.ver2
-rw-r--r--cwsdpmi/r5updtst.zipbin0 -> 31456 bytes
9 files changed, 831 insertions, 284 deletions
diff --git a/cwsdpmi/bin/cwsdpmi.doc b/cwsdpmi/bin/cwsdpmi.doc
index 14b09c4..de49034 100644
--- a/cwsdpmi/bin/cwsdpmi.doc
+++ b/cwsdpmi/bin/cwsdpmi.doc
@@ -1,173 +1,173 @@
-CWSDPMI is Copyright (C) 1995-2000 Charles W Sandmann (sandmann@clio.rice.edu)
- 1206 Braelinn, Sugar Land, TX 77479
-
-This is release 5. The files in this binary distribution may be redistributed
-under the GPL (with source) or without the source code provided:
-
-* CWSDPMI.EXE or CWSDPR0.EXE are not modified in any way except via CWSPARAM.
-
-* CWSDSTUB.EXE internal contents are not modified in any way except via
- CWSPARAM or STUBEDIT. It may have a COFF image plus data appended to it.
-
-* Notice to users that they have the right to receive the source code and/or
- binary updates for CWSDPMI. Distributors should indicate a site for the
- source in their documentation.
-
--------------------------------------------------------------------------------
-
-CWSDPMI was written to provide DPMI services for V2 of DJGPP. It currently
-does not support 16-bit DPMI applications, or DPMI applications requiring a
-built in extender. It does support virtual memory and hardware interrupt
-reflection from real mode to protected mode. DJGPP V1.1x and RSX applications
-will also run using this server, which can be used to provide enhanced control
-over hardware interrupts. Some DPMI 1.0 extensions (0x506, 0x507, 0x508) have
-been implemented.
-
-CWSDPR0.EXE is an alternate version which runs at ring 0 with virtual memory
-disabled. It may be used if access to ring-0 features are desired. It
-currently does not switch stacks on HW interrupts, so some DJGPP features
-such as SIGINT and SIGFPE are not supported and will generate a double fault
-or stack fault error (to be fixed someday).
-
-CWSDSTUB.EXE is a stub loader image for DJGPP which includes CWSDPMI. This
-allows single executable image distributions. You can use the EXE2COFF
-program and COPY /B CWSDSTUB.EXE+yourimage yourimage.exe to create a
-standalone executable image.
-
-Some of the internal tuning and configuration parameters may be modified
-in the image using CWSPARAM.EXE (see CWSPARAM.DOC).
-
-If you want to use CWSDPMI with DJGPP, you expand the distribution into the
-DJGPP directory tree. CWSDPMI.EXE will be put in the BIN directory with your
-DJGPP images and it will automatically be loaded when they run.
-
-Directions for use (server can be used in either of two different ways):
-
-1) "cwsdpmi" alone with no parameters will terminate and stay resident
- FOR A SINGLE DPMI PROCESS. This means it unloads itself when your
- DPMI application exits. This mode is useful in software which needs
- DPMI services, since CWSDPMI can be exec'ed and then will unload on exit.
-
-2) "cwsdpmi -p" will terminate and stay resident until you remove it.
- It can be loaded into UMBs with LH. "cwsdpmi -u" will unload the TSR.
-
-3) The file used for virtual memory swapping, if desired, is controlled
- by the "-sc:\cwsdpmi.swp" syntax on the command line. You must specify
- either a file with full disk/directory syntax, or "-s-" which disables
- virtual memory.
-
-4) The default swap file name is c:\cwsdpmi.swp, but this can be changed
- with the CWSPARAM image, as can some other parameters.
-
-5) You can disable the DPMI 1.0 extensions by starting the image with the
- "cwsdpmi -x" syntax. This feature allows you to run programs developed
- under other DPMI providers which do not behave properly with these
- extensions enabled (typically use of NULL pointers).
-
-I would like to give special thanks to DJ Delorie who wrote the original
-GO32 code on which CWSDPMI is based. Morten Welinder also provided and
-improved much of the code in this program.
-
--------------------------------------------------------------------------------
-
-This section contains a list of the error messages you might see out of
-CWSDPMI and some details on what they mean.
-
-Exceptions are only handled by CWSDPMI if the application does not establish
-an exception handler, exceptions nest 5 deep, or the error is particularly bad:
-
-"Page fault" -
- 1) an illegal page fault happens in a RMCB or HW interrupt, (lock all pages!)
- 2) all available pages have been locked,
- 3) the application is using non-committed pages for null pointer protection.
-"Double Fault" - multiple exceptions occurred
-"Invalid TSS" - typically due to RMCB or HW interrupt being called after the
- selectors/memory have been deallocated (remember to reset the mouse)
-"General Protection Fault" - bad parameter sent to a DPMI call
-
-"80386 required."
-
-Since 80286 and lesser processors don't have the hardware necessary to
-run CWSDPMI. No workaround, upgrade.
-
-"DOS 3 required."
-
-A few interrupts are used which need DOS 3.0 or higher. I don't expect to
-ever see this message, since 80386 machines were introduced after DOS 3.0
-and that check is made first.
-
-"CWSDPMI V0.90+ (r5) Copyright (C) 2000 CW Sandmann ABSOLUTELY NO WARRANTY"
-
-An informational message displayed if the program is not run in one-pass mode.
-
-"Protected mode not accessible."
-
-This message should only be displayed if running CWSDPMI in a protected
-environment with no access to protected mode. In this case, DPMI should
-already be available and CWSDPMI would not be needed. This might happen if
-a 16-bit DPMI client is loaded and a DJGPP image attempts to load CWSDPMI
-to provide 32-bit DPMI services under Windows.
-
-"Warning: cannot open swap file c:\cwsdpmi.swp"
-
-Maybe you are out of file handles, or the swap file name is incorrectly
-specified in the image (change the name with cwsparam).
-
-"No swap space!"
-
-This message means you tried to use more paging file than CWSDPMI was
-configured to handle. Since this is protected against in the memory
-allocation code, you should never see this message.
-
-"Swap disk full!"
-
-This means the paging file could not be expanded when trying to page
-memory out to disk. This would normally not be seen, unless you are
-writing output to the same disk which holds the paging file. Decrease
-the amount of memory your DPMI application is using or free up disk space.
-
-"Interrupt 0x??"
-
-Your application tried to call an interrupt from protected mode which
-normally shouldn't be called (something like a data pointer). If the
-request was allowed to continue it would likely hang your machine. If you
-see this message and think the interrupt should be allowed to continue, let
-me know.
-
-"Error: Using XMS switched CPU into V86 mode."
-
-This message might be seen if you have your memory manager in AUTO mode. The
-only workaround in this case is to stop using AUTO mode.
-
-"Error: could not allocate page table memory"
-
-The page table memory (a minimum of 16Kb) is allocated from conventional
-memory (either in the 640Kb region or UMBs). If CWSDPMI cannot allocate the
-minimum necessary memory, you would see this message. Free up some
-conventional memory. You may also see this message if a page directory needs
-to be faulted in, and there are no available pages. This means too many pages
-have been locked for the allocated page tables available. While CWSDPMI
-tries to dynamically allocate these if needed, this effort failed. You need
-to increase the number of page tables with CWSPARAM, or increase the amount
-of free conventional memory if it is low. If the application which calls
-CWSDPMI internally manages all the DOS memory, the page tables may need to
-be pre-allocated at DPMI startup time (if this is needed, try using the
-run option flag 2 in cwsparam).
-
-"16-bit DPMI unsupported."
-
-CWSDPMI is a 32-bit only DPMI server. Ideally, on the request to enter DPMI's
-PM with a 16-bit request, we would just fail the call setting the carry bit
-like the DPMI specification describes. Some buggy 16-bit compiler tools don't
-check the return status and will hang the machine in this case. So, I issue
-an error message and exit the image instead.
-
-"Descriptors exhausted."
-
-An attempt to nest a DPMI client failed in the setup phase due to insufficient
-free selectors in the LDT.
-
-"CWSDPMI not removed"
-
-When the -u parameter is specified, if DPMI is not detected this message is
-printed. Informational.
+CWSDPMI is Copyright (C) 1995-2000 Charles W Sandmann (sandmann@clio.rice.edu)
+ 1206 Braelinn, Sugar Land, TX 77479
+
+This is release 5. The files in this binary distribution may be redistributed
+under the GPL (with source) or without the source code provided:
+
+* CWSDPMI.EXE or CWSDPR0.EXE are not modified in any way except via CWSPARAM.
+
+* CWSDSTUB.EXE internal contents are not modified in any way except via
+ CWSPARAM or STUBEDIT. It may have a COFF image plus data appended to it.
+
+* Notice to users that they have the right to receive the source code and/or
+ binary updates for CWSDPMI. Distributors should indicate a site for the
+ source in their documentation.
+
+-------------------------------------------------------------------------------
+
+CWSDPMI was written to provide DPMI services for V2 of DJGPP. It currently
+does not support 16-bit DPMI applications, or DPMI applications requiring a
+built in extender. It does support virtual memory and hardware interrupt
+reflection from real mode to protected mode. DJGPP V1.1x and RSX applications
+will also run using this server, which can be used to provide enhanced control
+over hardware interrupts. Some DPMI 1.0 extensions (0x506, 0x507, 0x508) have
+been implemented.
+
+CWSDPR0.EXE is an alternate version which runs at ring 0 with virtual memory
+disabled. It may be used if access to ring-0 features are desired. It
+currently does not switch stacks on HW interrupts, so some DJGPP features
+such as SIGINT and SIGFPE are not supported and will generate a double fault
+or stack fault error (to be fixed someday).
+
+CWSDSTUB.EXE is a stub loader image for DJGPP which includes CWSDPMI. This
+allows single executable image distributions. You can use the EXE2COFF
+program and COPY /B CWSDSTUB.EXE+yourimage yourimage.exe to create a
+standalone executable image.
+
+Some of the internal tuning and configuration parameters may be modified
+in the image using CWSPARAM.EXE (see CWSPARAM.DOC).
+
+If you want to use CWSDPMI with DJGPP, you expand the distribution into the
+DJGPP directory tree. CWSDPMI.EXE will be put in the BIN directory with your
+DJGPP images and it will automatically be loaded when they run.
+
+Directions for use (server can be used in either of two different ways):
+
+1) "cwsdpmi" alone with no parameters will terminate and stay resident
+ FOR A SINGLE DPMI PROCESS. This means it unloads itself when your
+ DPMI application exits. This mode is useful in software which needs
+ DPMI services, since CWSDPMI can be exec'ed and then will unload on exit.
+
+2) "cwsdpmi -p" will terminate and stay resident until you remove it.
+ It can be loaded into UMBs with LH. "cwsdpmi -u" will unload the TSR.
+
+3) The file used for virtual memory swapping, if desired, is controlled
+ by the "-sc:\cwsdpmi.swp" syntax on the command line. You must specify
+ either a file with full disk/directory syntax, or "-s-" which disables
+ virtual memory.
+
+4) The default swap file name is c:\cwsdpmi.swp, but this can be changed
+ with the CWSPARAM image, as can some other parameters.
+
+5) You can disable the DPMI 1.0 extensions by starting the image with the
+ "cwsdpmi -x" syntax. This feature allows you to run programs developed
+ under other DPMI providers which do not behave properly with these
+ extensions enabled (typically use of NULL pointers).
+
+I would like to give special thanks to DJ Delorie who wrote the original
+GO32 code on which CWSDPMI is based. Morten Welinder also provided and
+improved much of the code in this program.
+
+-------------------------------------------------------------------------------
+
+This section contains a list of the error messages you might see out of
+CWSDPMI and some details on what they mean.
+
+Exceptions are only handled by CWSDPMI if the application does not establish
+an exception handler, exceptions nest 5 deep, or the error is particularly bad:
+
+"Page fault" -
+ 1) an illegal page fault happens in a RMCB or HW interrupt, (lock all pages!)
+ 2) all available pages have been locked,
+ 3) the application is using non-committed pages for null pointer protection.
+"Double Fault" - multiple exceptions occurred
+"Invalid TSS" - typically due to RMCB or HW interrupt being called after the
+ selectors/memory have been deallocated (remember to reset the mouse)
+"General Protection Fault" - bad parameter sent to a DPMI call
+
+"80386 required."
+
+Since 80286 and lesser processors don't have the hardware necessary to
+run CWSDPMI. No workaround, upgrade.
+
+"DOS 3 required."
+
+A few interrupts are used which need DOS 3.0 or higher. I don't expect to
+ever see this message, since 80386 machines were introduced after DOS 3.0
+and that check is made first.
+
+"CWSDPMI V0.90+ (r5) Copyright (C) 2000 CW Sandmann ABSOLUTELY NO WARRANTY"
+
+An informational message displayed if the program is not run in one-pass mode.
+
+"Protected mode not accessible."
+
+This message should only be displayed if running CWSDPMI in a protected
+environment with no access to protected mode. In this case, DPMI should
+already be available and CWSDPMI would not be needed. This might happen if
+a 16-bit DPMI client is loaded and a DJGPP image attempts to load CWSDPMI
+to provide 32-bit DPMI services under Windows.
+
+"Warning: cannot open swap file c:\cwsdpmi.swp"
+
+Maybe you are out of file handles, or the swap file name is incorrectly
+specified in the image (change the name with cwsparam).
+
+"No swap space!"
+
+This message means you tried to use more paging file than CWSDPMI was
+configured to handle. Since this is protected against in the memory
+allocation code, you should never see this message.
+
+"Swap disk full!"
+
+This means the paging file could not be expanded when trying to page
+memory out to disk. This would normally not be seen, unless you are
+writing output to the same disk which holds the paging file. Decrease
+the amount of memory your DPMI application is using or free up disk space.
+
+"Interrupt 0x??"
+
+Your application tried to call an interrupt from protected mode which
+normally shouldn't be called (something like a data pointer). If the
+request was allowed to continue it would likely hang your machine. If you
+see this message and think the interrupt should be allowed to continue, let
+me know.
+
+"Error: Using XMS switched CPU into V86 mode."
+
+This message might be seen if you have your memory manager in AUTO mode. The
+only workaround in this case is to stop using AUTO mode.
+
+"Error: could not allocate page table memory"
+
+The page table memory (a minimum of 16Kb) is allocated from conventional
+memory (either in the 640Kb region or UMBs). If CWSDPMI cannot allocate the
+minimum necessary memory, you would see this message. Free up some
+conventional memory. You may also see this message if a page directory needs
+to be faulted in, and there are no available pages. This means too many pages
+have been locked for the allocated page tables available. While CWSDPMI
+tries to dynamically allocate these if needed, this effort failed. You need
+to increase the number of page tables with CWSPARAM, or increase the amount
+of free conventional memory if it is low. If the application which calls
+CWSDPMI internally manages all the DOS memory, the page tables may need to
+be pre-allocated at DPMI startup time (if this is needed, try using the
+run option flag 2 in cwsparam).
+
+"16-bit DPMI unsupported."
+
+CWSDPMI is a 32-bit only DPMI server. Ideally, on the request to enter DPMI's
+PM with a 16-bit request, we would just fail the call setting the carry bit
+like the DPMI specification describes. Some buggy 16-bit compiler tools don't
+check the return status and will hang the machine in this case. So, I issue
+an error message and exit the image instead.
+
+"Descriptors exhausted."
+
+An attempt to nest a DPMI client failed in the setup phase due to insufficient
+free selectors in the LDT.
+
+"CWSDPMI not removed"
+
+When the -u parameter is specified, if DPMI is not detected this message is
+printed. Informational.
diff --git a/cwsdpmi/bin/cwsdpmi.exe b/cwsdpmi/bin/cwsdpmi.exe
index 17e3220..2285a74 100644
--- a/cwsdpmi/bin/cwsdpmi.exe
+++ b/cwsdpmi/bin/cwsdpmi.exe
Binary files differ
diff --git a/cwsdpmi/bin/cwsdstub.exe b/cwsdpmi/bin/cwsdstub.exe
index fabaf3b..5388d00 100644
--- a/cwsdpmi/bin/cwsdstub.exe
+++ b/cwsdpmi/bin/cwsdstub.exe
Binary files differ
diff --git a/cwsdpmi/bin/cwsparam.doc b/cwsdpmi/bin/cwsparam.doc
index 92d4c98..8ed0f97 100644
--- a/cwsdpmi/bin/cwsparam.doc
+++ b/cwsdpmi/bin/cwsparam.doc
@@ -1,102 +1,102 @@
-CWSPARAM provided by Charles W Sandmann (sandmann@clio.rice.edu)
- 1206 Braelinn, Sugar Land, TX 77479
-CWSPARAM OVERVIEW
-
-There are certain parameters built into the CWSDPMI.EXE, CWSDPR0.EXE, and
-CWSDSTUB.EXE images which might need to be modified for distributing some
-programs for better performance. The modified image could be renamed, and
-then the DPMI server name in a DJGPP V2 image may be stubedited to use the
-new name. CWSPARAM can also be run directly on images created by appending
-COFF images to CWSDSTUB.EXE. The parameters which can be modified are
-discussed below:
-
-Full name of paging file ("" to disable) ? [c:\cwsdpmi.swp]
-
- This is where the file which provides virtual memory should be located. It
- may be desirable to change the default to a faster disk or one with more
- free space. To disable paging, enter two double quotes. The file name
- MUST contain the disk, full path, and file name. Anything less may cause
- unpredictable behavior. The maximum length of the name is 48 characters,
- and it must be a DOS 8.3 style name. Press return to keep the current value.
-
-Number of page tables to initially allocate (0=auto) ? [0]
-
- Page tables are stored in the DOS memory area and consume this precious
- resource. The default value of 0 chooses automatic allocation of enough
- page tables to hold all of the physical memory without paging (with the
- minimum enough to hold 20Mb without paging and a maximum to hold 128Mb).
- If your program is a fixed size (and does not spawn any other DPMI images)
- you can specify one page table for each 4Mb of your program's size. If
- your program is small, this can save a small amount of DOS memory, which
- might be needed for other purposes. If your program is large (typically
- larger than the physical memory) specifying a number will consume more DOS
- memory but improve performance since the page tables themselves will not
- page. CWSDPMI will attempt to dynamically allocate additional page tables
- at run time to prevent paging, but if all of the DOS memory is free,
- performance would be degraded. Remember to add an extra page table if
- mapping physical devices. As of r5, you must also allocate additional
- space for the bitmaps for physical and virtual memory (one bit for each
- 4K page). Add one page for each 128Mb of total address space
- (physical+virtual). Be generous, since someone may run the image on a
- 512Mb machine (or larger) and require 4 pages for the physical bitmap
- even if you disable virtual memory.
-
-Minimum application memory desired before 640K paging ? [512Kb]
-
- Typically, CWSDPMI only uses extended memory to return as DPMI memory, and
- saves the DOS memory area for DOS requests. On small memory machines with
- applications not needing much DOS memory (or poorly tuned memory management)
- there may be very little extended memory left available, with up to 600K of
- DOS memory unused. This parameter determines the threshold which CWSDPMI
- should start using DOS memory as DPMI memory. If an application is known to
- not need much DOS memory, this value could be set to the size of the memory
- required for the image, which provides roughly 0.5Mb additional memory before
- paging happens. This parameter is one I would expect might be adjusted when
- distributing an application for maximum performance on a wide variety of
- machines.
-
-Paragraphs of DOS memory to reserve when 640K paging ? [3840]
-
- If the image needs to page in the DOS memory area (triggered by the parameter
- value above), this parameter tells how much DOS memory to save for DOS
- allocation requests. The value is in paragraphs (16 byte increments), so the
- default is 60Kbytes. You will actually end up with a bit more probably, since
- the page tables are allocated on 4Kbyte rounded boundaries. Some amount of
- DOS memory needs to be saved for potentially expanding the file table, the
- sbrk() algorithm, DMA buffers, etc. This amount can be tuned on an image
- by image basis, and may be as little as 0.
-
-Paragraphs of memory for extra CWSDPMI internal heap ? [256]
-
- CWSDPMI is built with an internal 4K heap. Each nested task consumes around
- 300 bytes, each memory zone takes 12 bytes, and each HW interrupt (nested)
- takes around 850 bytes. If extra DOS memory is available, the additional
- paragraphs specified here are added to the heap at execution time by DOS.
- The 8K default should be good for up to 40Mb in small requests. If you
- compile very large C++ programs or allocate lots of memory in small pieces,
- you might need to bump this parameter. If you are very tight on memory,
- you could decrease it to zero and pick up another 4K of DOS memory. Each
- paragraph allows a little more than one more memory zone (or in the worse
- case around 85Kb of DPMI memory).
-
-Maximum size of swap file ? [128Mb]
-
- CWSDPMI dynamically allocates memory at run time for up to 2044Mb of swap file
- space. The bitmap for the swap usage requires 32 bytes of memory per 1Mb of
- swap usage. The default will provide up to 128Mb of swap space with a run
- time memory requirement of 4Kb DOS memory. The dynamic allocation is limited
- by the free space on the drive, so if you don't have much space on your hard
- drive, you don't need to worry about this. If you run small programs and want
- to save memory (maybe to stuff the allocation in a UMB) you can decrease this
- value. If you want to run monster programs needing 2Gb of address space you
- can increase this value (but this would increase the DOS memory usage). This
- value is ignored by CWSDPR0.
-
-Value of run option flags ? [0]
-
- There are a few run-time options in CWSDPMI which should not be needed by most
- users which can be activated by this field of bit flags:
- Bit 0 (1): Disable allocation of run time page tables in UMBs (low only)
- Bit 1 (2): Pre-allocate page table memory (in DPMI memory request)
- Bit 2 (4): Disable DPMI 1.0 extensions (Null page protection, mapping)
- Other values should be zero for future compatibility but are currently ignored.
+CWSPARAM provided by Charles W Sandmann (sandmann@clio.rice.edu)
+ 1206 Braelinn, Sugar Land, TX 77479
+CWSPARAM OVERVIEW
+
+There are certain parameters built into the CWSDPMI.EXE, CWSDPR0.EXE, and
+CWSDSTUB.EXE images which might need to be modified for distributing some
+programs for better performance. The modified image could be renamed, and
+then the DPMI server name in a DJGPP V2 image may be stubedited to use the
+new name. CWSPARAM can also be run directly on images created by appending
+COFF images to CWSDSTUB.EXE. The parameters which can be modified are
+discussed below:
+
+Full name of paging file ("" to disable) ? [c:\cwsdpmi.swp]
+
+ This is where the file which provides virtual memory should be located. It
+ may be desirable to change the default to a faster disk or one with more
+ free space. To disable paging, enter two double quotes. The file name
+ MUST contain the disk, full path, and file name. Anything less may cause
+ unpredictable behavior. The maximum length of the name is 48 characters,
+ and it must be a DOS 8.3 style name. Press return to keep the current value.
+
+Number of page tables to initially allocate (0=auto) ? [0]
+
+ Page tables are stored in the DOS memory area and consume this precious
+ resource. The default value of 0 chooses automatic allocation of enough
+ page tables to hold all of the physical memory without paging (with the
+ minimum enough to hold 20Mb without paging and a maximum to hold 128Mb).
+ If your program is a fixed size (and does not spawn any other DPMI images)
+ you can specify one page table for each 4Mb of your program's size. If
+ your program is small, this can save a small amount of DOS memory, which
+ might be needed for other purposes. If your program is large (typically
+ larger than the physical memory) specifying a number will consume more DOS
+ memory but improve performance since the page tables themselves will not
+ page. CWSDPMI will attempt to dynamically allocate additional page tables
+ at run time to prevent paging, but if all of the DOS memory is free,
+ performance would be degraded. Remember to add an extra page table if
+ mapping physical devices. As of r5, you must also allocate additional
+ space for the bitmaps for physical and virtual memory (one bit for each
+ 4K page). Add one page for each 128Mb of total address space
+ (physical+virtual). Be generous, since someone may run the image on a
+ 512Mb machine (or larger) and require 4 pages for the physical bitmap
+ even if you disable virtual memory.
+
+Minimum application memory desired before 640K paging ? [512Kb]
+
+ Typically, CWSDPMI only uses extended memory to return as DPMI memory, and
+ saves the DOS memory area for DOS requests. On small memory machines with
+ applications not needing much DOS memory (or poorly tuned memory management)
+ there may be very little extended memory left available, with up to 600K of
+ DOS memory unused. This parameter determines the threshold which CWSDPMI
+ should start using DOS memory as DPMI memory. If an application is known to
+ not need much DOS memory, this value could be set to the size of the memory
+ required for the image, which provides roughly 0.5Mb additional memory before
+ paging happens. This parameter is one I would expect might be adjusted when
+ distributing an application for maximum performance on a wide variety of
+ machines.
+
+Paragraphs of DOS memory to reserve when 640K paging ? [3840]
+
+ If the image needs to page in the DOS memory area (triggered by the parameter
+ value above), this parameter tells how much DOS memory to save for DOS
+ allocation requests. The value is in paragraphs (16 byte increments), so the
+ default is 60Kbytes. You will actually end up with a bit more probably, since
+ the page tables are allocated on 4Kbyte rounded boundaries. Some amount of
+ DOS memory needs to be saved for potentially expanding the file table, the
+ sbrk() algorithm, DMA buffers, etc. This amount can be tuned on an image
+ by image basis, and may be as little as 0.
+
+Paragraphs of memory for extra CWSDPMI internal heap ? [256]
+
+ CWSDPMI is built with an internal 4K heap. Each nested task consumes around
+ 300 bytes, each memory zone takes 12 bytes, and each HW interrupt (nested)
+ takes around 850 bytes. If extra DOS memory is available, the additional
+ paragraphs specified here are added to the heap at execution time by DOS.
+ The 8K default should be good for up to 40Mb in small requests. If you
+ compile very large C++ programs or allocate lots of memory in small pieces,
+ you might need to bump this parameter. If you are very tight on memory,
+ you could decrease it to zero and pick up another 4K of DOS memory. Each
+ paragraph allows a little more than one more memory zone (or in the worse
+ case around 85Kb of DPMI memory).
+
+Maximum size of swap file ? [128Mb]
+
+ CWSDPMI dynamically allocates memory at run time for up to 2044Mb of swap file
+ space. The bitmap for the swap usage requires 32 bytes of memory per 1Mb of
+ swap usage. The default will provide up to 128Mb of swap space with a run
+ time memory requirement of 4Kb DOS memory. The dynamic allocation is limited
+ by the free space on the drive, so if you don't have much space on your hard
+ drive, you don't need to worry about this. If you run small programs and want
+ to save memory (maybe to stuff the allocation in a UMB) you can decrease this
+ value. If you want to run monster programs needing 2Gb of address space you
+ can increase this value (but this would increase the DOS memory usage). This
+ value is ignored by CWSDPR0.
+
+Value of run option flags ? [0]
+
+ There are a few run-time options in CWSDPMI which should not be needed by most
+ users which can be activated by this field of bit flags:
+ Bit 0 (1): Disable allocation of run time page tables in UMBs (low only)
+ Bit 1 (2): Pre-allocate page table memory (in DPMI memory request)
+ Bit 2 (4): Disable DPMI 1.0 extensions (Null page protection, mapping)
+ Other values should be zero for future compatibility but are currently ignored.
diff --git a/cwsdpmi/bin/mswitch.asm b/cwsdpmi/bin/mswitch.asm
new file mode 100644
index 0000000..32df5ed
--- /dev/null
+++ b/cwsdpmi/bin/mswitch.asm
@@ -0,0 +1,536 @@
+; Copyright (C) 1995-2002 CW Sandmann (sandmann@clio.rice.edu) 1206 Braelinn, Sugar Land, TX 77479
+; Copyright (C) 1993 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
+;
+; This file is distributed under the terms listed in the document
+; "copying.cws", available from CW Sandmann at the address above.
+; A copy of "copying.cws" should accompany this file; if not, a copy
+; should be available from where this file was obtained. This file
+; may not be distributed without a verbatim copy of "copying.cws".
+;
+; This file is distributed WITHOUT ANY WARRANTY; without even the implied
+; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+; Modified for VCPI Implement by Y.Shibata Aug 5th 1991
+; Modified for PC98 A20 line control by kaho Aug 5 1998
+
+ title switch between real and protected mode
+ include segdefs.inc
+ include tss.inc
+ include gdt.inc
+ include vcpi.inc
+
+;------------------------------------------------------------------------
+
+ start_data16
+
+ extrn _gdt:gdt_s
+ extrn _gdt_phys:gdt_s
+ extrn _idt_phys:gdt_s
+ extrn _tss_ptr:word
+ extrn _use_xms:byte
+ extrn _hard_master_lo:byte
+ extrn _hard_master_hi:byte
+ extrn _hard_slave_lo:byte
+ extrn _hard_slave_hi:byte
+ extrn _mtype:byte
+
+ extrn _vcpi_installed:byte ;VCPI Installed set this not Zero
+ extrn _vcpi_entry:fword
+ extrn _abs_client:dword
+ extrn _DPMIsp:word
+ extrn _saved_interrupt_vector:dword
+
+ end_data16
+ start_bss
+
+ public _dr
+_dr label dword
+_dr0 dd ?
+_dr1 dd ?
+_dr2 dd ?
+_dr3 dd ?
+ dd ?
+ dd ?
+_dr6 dd ?
+_dr7 dd ?
+
+ public _c_tss, _a_tss, _o_tss, _f_tss
+_c_tss label tss_s ; for "real mode" state
+ db type tss_s dup (?)
+_a_tss label tss_s ; for running program
+ db type tss_s dup (?)
+_o_tss label tss_s ; for convenience functions
+ db type tss_s dup (?)
+_f_tss label tss_s ; for page handling
+ db type tss_s dup (?)
+
+ public _features
+_features dd ? ; CPUID features
+ public _was_exception
+_was_exception db ? ; exceptions set this to 1
+
+ end_bss
+
+;------------------------------------------------------------------------
+
+ start_code16
+
+ extrn _xms_local_enable_a20:near
+ extrn _xms_local_disable_a20:near
+
+real_stack dd ?
+real_idt dw 03ffh, 0000h, 0000h
+
+ public _go32
+_go32 proc near
+ push si
+ push di
+ push bx
+_go32_1:
+; push 0b000h ;dbg
+; pop fs ;dbg
+; mov word ptr fs:[0f01h],07h ;dbg - normal
+ mov ax,DGROUP ; Compute physical offset
+ xor dx,dx ; of tss_ptr
+ shld dx,ax,4 ; Seg * 16
+ shl ax,4
+ add ax,_tss_ptr ; plus tss_ptr
+ adc dx,0
+ mov _gdt[g_atss].base0,ax ; Trick here - make atss
+ mov _gdt[g_atss].base1,dl ; selector point to
+ mov _gdt[g_atss].base2,dh ; tss_ptr (jmpt g_atss)
+
+
+ mov al,0fdh ; clear busy flag
+ and byte ptr _gdt[g_atss].stype,al
+ and byte ptr _gdt[g_ctss].stype,al ; non-VCPI LDTR below
+
+ mov _was_exception,0
+
+; set real_stack for return from _go32
+ mov word ptr cs:real_stack,sp
+ mov word ptr cs:real_stack+2,ss
+ movzx esp,sp ; make sure it's OK
+
+ cli
+
+ cmp _vcpi_installed,0
+ je short real_to_protect ;Not VCPI Mode
+ mov esi,_abs_client
+ mov ax,VCPI_MODE_CHANGE
+ int VCPI_REQ ;Change Protect Mode
+;end_loop0:
+; jmp short end_loop0 ;Never Come here!! Safety Loop
+
+real_to_protect:
+ call _set_a20
+ or _gdt[g_rdata].lim1,40h ;Set the big bit (non-vcpi only)
+ lgdt fword ptr _gdt_phys
+ lidt fword ptr _idt_phys
+
+ mov eax,cr0
+ or al,1
+ mov cr0,eax ; we're in protected mode!
+ db 0eah ; far jmp
+ dw offset go_protect_far_jump
+ dw g_rcode
+;
+; Entry Protect Mode
+;
+ public _protect_entry
+_protect_entry label near
+
+go_protect_far_jump:
+ cli
+ mov ax,g_rdata
+ mov ds,ax
+ mov es,ax
+ mov fs,ax
+ mov gs,ax
+ mov ss,ax
+ movzx esp,word ptr cs:real_stack ;Need VCPI Inialize
+ xor eax,eax
+ mov cr2,eax ;zero so we can tell INT 0E from page fault
+
+ mov eax,_dr0
+ mov dr0,eax
+ mov eax,_dr1
+ mov dr1,eax
+ mov eax,_dr2
+ mov dr2,eax
+ mov eax,_dr3
+ mov dr3,eax
+ mov eax,_dr6
+ mov dr6,eax
+ mov eax,_dr7
+ mov dr7,eax
+
+ test byte ptr _features,8 ;Page Size Extensions?
+ jz short nopse
+ db 0fh,20h,0e0h ;mov eax,cr4
+ or al,10h ;Enable 4Mb pages
+ db 0fh,22h,0e0h ;mov cr4,eax
+nopse:
+
+ cmp _vcpi_installed,0
+ jne short no_tss_load ;Now Paging Mode in VCPI
+ mov bx,_tss_ptr
+ mov eax,[bx].tss_cr3
+ or eax,eax ;Test for zero
+ je short set_paging_far_jump
+ mov cr3,eax
+ mov eax,cr0
+ or eax,80000000h
+ mov cr0,eax ; paging enabled!
+ db 0eah ; far jmp
+ dw offset set_paging_far_jump
+ dw g_rcode
+set_paging_far_jump:
+ mov ax,g_ctss
+ ltr ax
+ jmp short no_tss_load ; Chip errata fix from Symantec
+no_tss_load:
+ jmpt g_atss ; load state from VCPU
+
+_go32 endp
+
+; _go_real_mode must follow the task jump, so a task jump to return
+; is valid
+
+ public _go_real_mode
+_go_real_mode proc near
+
+ mov eax,dr6
+ mov _dr6,eax
+
+ cmp _vcpi_installed,0
+ je short protect_to_real
+
+;Make VCPI call to return to real
+ clts ;TS Clear
+ mov eax,DGROUP
+ push eax ;GS
+ push eax ;FS
+ push eax ;DS
+ push eax ;ES
+ push eax ;SS
+ movzx eax,word ptr cs:real_stack
+ push eax ;ESP
+ pushfd ;EFLAGS
+ mov ax,_TEXT ;high word still zero
+ push eax ;CS
+ mov ax,offset back_to_v86 ;high word still zero
+ push eax ;EIP
+; movzx esp,sp
+
+ mov ax,g_core
+ mov ds,ax
+ mov ax,VCPI_MODE_CHANGE
+ assume es:DGROUP
+ call fword ptr es:_vcpi_entry
+;end_loop1:
+; jmp short end_loop1 ;Never Come here!! Safety Loop
+
+protect_to_real:
+ and _gdt[g_rdata].lim1,0bfh ;Clear the big bit (non-vcpi only)
+ push ss
+ pop ss ;Reload
+ mov eax,cr0
+ and eax,07ffffff6h ; clear PE, TS, PG
+ mov cr0,eax
+
+ db 0eah ; far jmp
+ dw offset back_to_real_far_jump
+ dw _TEXT
+;
+; Entry Real Mode
+;
+back_to_real_far_jump:
+
+ lidt fword ptr cs:real_idt
+ lss sp,cs:real_stack
+back_to_v86:
+
+ mov ax,ss
+ mov ds,ax
+ mov es,ax
+ mov fs,ax
+ mov gs,ax
+
+; call _reset_a20
+
+ cmp _was_exception,0
+ je short not_hard
+
+ mov bx,_tss_ptr
+ mov al,[bx].tss_irqn
+
+; push 0b000h ;dbg
+; pop fs ;dbg
+; mov ah, 70h ;dbg - reverse
+; mov word ptr fs:[0f00h],ax ;dbg
+
+ mov bx,16 ;pseudo IRQ
+ cmp al,1ch
+ je short is_hard_1
+ xor bx,bx ;IRQ base
+ cmp al,_hard_master_lo
+ jb short try_slavepic
+ cmp al,_hard_master_hi
+ jbe short is_hard
+try_slavepic:
+ mov bl,8 ;IRQ base
+ cmp al,_hard_slave_lo
+ jb short not_hard
+ cmp al,_hard_slave_hi
+ ja short not_hard
+
+is_hard:
+; mov cl,_hard_slave_lo
+; add cl,5
+; cmp al,cl
+; je short not_hard ; for NPX errors
+
+; mov cl,_hard_master_lo
+; inc cl
+; cmp al,cl
+; je short not_hard ; to check for ^C
+
+ mov ah,al
+ and ah,7 ; IRQ offset
+ add bl,ah ; IRQ #
+is_hard_1:
+ shl bx,2
+ add bx,offset _saved_interrupt_vector ;ES is already DS
+ cmp word ptr [bx+2],0
+ jne short redirect
+
+ push 0 ; Not redirected, use interrupt table
+ pop es
+ movzx bx,al
+ shl bx,2 ; 4 bytes per interrupt entry
+redirect:
+ push _DPMIsp ; Needed for RMCB's to be recursive
+ mov _DPMIsp,sp
+ sub _DPMIsp,spare_stack
+ push 3002h
+ call dword ptr es:[bx] ; Really an interrupt
+ pop _DPMIsp
+ jmp _go32_1
+
+not_hard:
+ pop bx
+ pop di
+ pop si
+ ret
+
+_go_real_mode endp
+
+;------------------------------------------------------------------------
+ public _reset_a20
+_reset_a20 proc near
+ cmp _vcpi_installed,0
+ jne short reset_a20_nop
+ cmp _use_xms,0
+ je short reset_a20_local
+ call _xms_local_disable_a20
+reset_a20_nop:
+ ret
+
+reset_a20_pc98:
+ mov al,3
+ out 0f6h,al ; disable the A20 line
+ ret
+reset_a20_local:
+ cmp _mtype,0 ; PC98 raw mode
+ jne short reset_a20_pc98
+ in al,092h ; 092h PS/2 & clone system control port "A"
+ and al,not 2 ; this resets the A20 bit in register al
+ jmp short $+2 ; forget the instruction fetch
+ out 092h,al ; set the A20 bit off
+ ret
+_reset_a20 endp
+
+ public _set_a20
+_set_a20 proc near
+ cmp _vcpi_installed,0
+ jne short set_a20_nop
+ call check_a20 ; If already enabled skip A20 enable
+ jz short set_a20_nop
+ cmp _use_xms,0
+ je short set_a20_local
+ call _xms_local_enable_a20
+set_a20_nop:
+ ret
+
+set_a20_pc98:
+ mov al,2
+ out 0f6h,al ; enable the A20 line
+ ret
+set_a20_local:
+ cmp _mtype,0 ; PC98 raw mode
+ jne short set_a20_pc98
+ pushf
+ cli
+
+ in al,092h ; 092h PS/2 & clone system control port "A"
+ or al,2 ; this sets the A20 bit in register al
+ jmp short $+2 ; forget the instruction fetch
+ out 092h,al ; set the A20 bit on
+
+ call check_a20
+ jz short a20_done
+
+need_to_set_a20:
+ call waitkb
+ mov al,0d1h
+ out 64h,al
+ call waitkb
+ mov al,0dfh ; Patrick
+ out 60h,al
+ call waitkb
+ mov al,0ffh ; Patrick
+ out 64h,al ; Patrick
+ call waitkb ; Patrick
+
+wait_for_valid_a20:
+ call check_a20
+ jnz short wait_for_valid_a20
+a20_done:
+ popf
+ ret
+
+; interrupts disabled, ax, dx, es destroyed, returns z bit if a20 enabled
+check_a20:
+ ; Modified by Prashant TR - don't use fs and gs here before switching
+ ; to protmode. FS/GS left from TC++ 3.0 can kill us when we come here.
+ push bx
+ push ds
+ xor ax,ax ; zero it
+ mov ds,ax
+ dec ax ; ax = 0ffffh
+ mov es,ax
+ xor bx,bx
+
+ mov ax,ds:[bx] ; word from 0:0 (int 0 interrupt)
+ mov dx,ax ; save it
+ not ax ; make a different value
+ xchg ax,es:[bx+10h] ; modify ffff:10h to known different value
+ xchg cx,ds:[bx] ; get ds:[0] with a write
+ cmp dx,cx ; compare 0:0 with saved; z bit if same = a20
+ mov es:[bx+10h],ax ; restore
+ mov ds:[bx],dx
+
+ pop ds
+ pop bx
+ ret
+
+waitkb:
+ xor cx,cx ; zero it
+waitkb1:
+ jmp short $+2
+ jcxz short $+2
+ in al,64h
+ test al,2
+ loopnz waitkb1
+ ret
+_set_a20 endp
+
+;------------------------------------------------------------------------
+
+ public _cpumode ; 0=real mode, 1=V86
+_cpumode:
+ smsw ax
+ and ax,1
+ ret
+
+;------------------------------------------------------------------------
+; Determination of Cpu type. EAX, EBX, ECX, EDX destroyed.
+; 0 for 8086/80186
+; 2 for 80286
+; 3 for 386
+; 4 for 486
+; 5 for 586 (Pentium) or better (thanks, Morten!)
+
+cpuid macro
+ db 0fh,0a2h
+ endm
+
+ public _cputype ; from Intel 80486 reference manual
+_cputype:
+ xor cx,cx ; default type is 8086
+ pushf
+ pop bx
+ and bh,0fh
+ push bx
+ popf
+ pushf
+ pop ax
+ and ax,0f000h
+ cmp ax,0f000h
+ jz short cpu8086
+ or bh,0f0h
+ push bx
+ popf
+ pushf
+ pop ax
+ and ax,0f000h
+ jz short cpu286
+
+ mov dx,sp ; Save old SP
+ and sp,not 3 ; Align it! (we will set AC flag)
+ mov al,18 ; AC flag number
+ call cpuflipflag
+ mov sp,dx
+ jnc short cpu386
+ mov al,21 ; ID flag number
+ call cpuflipflag
+ jnc short cpu486
+
+;The cpu supports the CPUID instruction. Maybe Pentium or late 486?
+ xor eax,eax
+ cpuid ; ebx:edx:ecx = vendor id; eax = max support
+ or eax,eax
+ mov al,5
+ jz short cpu_pentium
+ xor eax,eax
+ inc ax ; call with eax = 1
+ cpuid ; edx=features; ah&0f = family; al=model/step
+ mov al,ah
+ mov _features,edx
+cpu_pentium:
+ and ax,0fh
+ ret
+cpu486:
+ inc cx
+cpu386:
+ inc cx
+cpu286:
+ inc cx
+ inc cx
+cpu8086: ; or 186
+ mov ax,cx
+ ret
+
+cpuflipflag: ; Try to flip flag #Al in Eflags, Return C=1 if possible
+ push si ; This plus the pushed ret address still stack aligned
+ movzx esi,al
+ pushfd
+ pop eax
+ mov ebx,eax
+ btc eax,esi
+ push eax
+ popfd
+ pushfd
+ pop eax
+ xor eax,ebx
+ push ebx
+ popfd
+ bt eax,esi
+ pop si
+ ret
+;------------------------------------------------------------------------
+
+ end_code16
+
+ end
diff --git a/cwsdpmi/bin/readme.upd b/cwsdpmi/bin/readme.upd
new file mode 100644
index 0000000..6d7cdec
--- /dev/null
+++ b/cwsdpmi/bin/readme.upd
@@ -0,0 +1,11 @@
+This is an update of the r5 distribution for testing purposes. It is a test
+version! The copyright banner has an updated year but the images are very
+similar to the standard r5 binaries. Three bug fixes:
+
+1) Test of PSE feature checks correct bit (removes warnings with BOCHS).
+2) Load ESP properly to clear upper bits with VCPI servers setting them
+ (Martin, please test!)
+3) Serializing jump to avoid Pentium III bug hang (Symantec bug).
+
+MSWITCH.ASM includes all three changes. The copyright year is also changed
+in control.c - but a single byte change isn't worth including here.
diff --git a/cwsdpmi/manifest/csdpmi5b.mft b/cwsdpmi/manifest/csdpmi5b.mft
index ae143fe..b8e2f91 100644
--- a/cwsdpmi/manifest/csdpmi5b.mft
+++ b/cwsdpmi/manifest/csdpmi5b.mft
@@ -1,8 +1,8 @@
-manifest/csdpmi5b.mft
-manifest/csdpmi5b.ver
-bin/cwsdpmi.doc
-bin/cwsdpmi.exe
-bin/cwsdpr0.exe
-bin/cwsparam.doc
-bin/cwsparam.exe
-bin/cwsdstub.exe
+manifest/csdpmi5b.mft
+manifest/csdpmi5b.ver
+bin/cwsdpmi.doc
+bin/cwsdpmi.exe
+bin/cwsdpr0.exe
+bin/cwsparam.doc
+bin/cwsparam.exe
+bin/cwsdstub.exe
diff --git a/cwsdpmi/manifest/csdpmi5b.ver b/cwsdpmi/manifest/csdpmi5b.ver
index 9340dd8..2aebd47 100644
--- a/cwsdpmi/manifest/csdpmi5b.ver
+++ b/cwsdpmi/manifest/csdpmi5b.ver
@@ -1 +1 @@
-csdpmi5b CWSDPMI binary distribution (release 5)
+csdpmi5b CWSDPMI binary distribution (release 5)
diff --git a/cwsdpmi/r5updtst.zip b/cwsdpmi/r5updtst.zip
new file mode 100644
index 0000000..26af0e0
--- /dev/null
+++ b/cwsdpmi/r5updtst.zip
Binary files differ