Contents 1. About Jemm 2. Jemm's Features 3. Commandline Options 4. EMS Implementation Notes 5. Emulation of privileged Opcodes 6. JLoad and JLMs 6.1 XDMA32 - UltraDMA HD driver 6.2 XCDROM32 - UltraDMA CD-ROM/DVD driver 7. Other Tools 7.1 UMBM 7.2 JEMFBHLP 7.3 EMSSTAT 8. Troubleshooting, Hints 9. History 10. License 1. About Jemm Jemm is an "Expanded Memory Manager", based on the source of FreeDOS Emm386. It should work with FreeDOS, MS-DOS and compatible DOSes. Like other EMMs it provides the following services to DOS applications: - expanded memory (EMS) according to EMS v3.2 and EMS v4.0. - upper memory blocks (UMB) where drivers and resident programs may be loaded, thus increasing available free DOS memory. - mapping RAM to the video address segments A000-AFFF and B000-B7FF. - VCPI services to allow DOS applications running in V86-mode to switch to protected mode. VCPI also implements a simple memory management. - VDS API to give drivers/applications some control over DMA and physical addresses in V86-mode. There exist 2 versions of Jemm: - Jemm386: standard version which needs an external XMM (HimemX.exe for example) to be loaded. - JemmEx: extended version which has an XMM already included. JemmEx most likely is the better choice because it will need less DOS memory than an external XMM + Jemm386. 2. Jemm's Features The main purpose of making Jemm was to make it use less resources than other EMMs, without making compromises regarding speed or compatibility. The results currently are: - Jemm386 needs just 128 bytes DOS upper memory. JemmEx uses more, mostly because it includes the XMS handle array which is located in DOS memory. With 32 XMS handles JemmEx needs 496 bytes DOS memory. - Jemm's extended memory usage is: + 44 kB for Jemm itself + 64 kB for the DMA buffer (default size) + xx kB for UMBs mapped in the first MB + 4 kB fixed amount for EMS handle management. + xx kB variable amount for EMS/VCPI memory management. For each 1.5 MB VCPI memory 64 bytes are needed, for each EMS page 5 bytes are needed. For the default values (120 MB VCPI, 2048 EMS pages) this is 16 kB. - VCPI shared address space in extended memory is just 4 kB. Other features are: - Jemm can be loaded and unloaded from the command line. Disadvantage: DOS won't care about UMBs supplied this way. - CPUs which provide the Virtual-8086 Mode Extensions (Pentium+) are actively supported, which increases the emulation speed. - with the help of JLOAD Jemm provides an API for 32bit protected-mode extensions (JLMs). - the FASTBOOT option shortens reboot time. - the SPLIT option can gain additional DOS high memory. - Exceptions in protected-mode are detected and displayed. 3. Commandline Options For a list of available options enter: JEMM386/JEMMEX -? Option Comment ---------------------------------------------------------- A20/NOA20 will set the A20 enable/disable emulation accordingly. ALTBOOT this option is meant to select an alternate reboot handler, if the standard handler doesn't work. Currently it does nothing. B=xxxx specify lowest segment address for EMS banking (default=4000, min=1000). D=nnn this option will set the size of the DMA buffer to kB. The default size is 64 kB, max size is 128 kB. Will always be rounded up to next 4 kB. EMX option to prevent EMX DOS extender from quickly terminating with message "out of memory (RM)" on machines with large amounts of RAM (> 256 MB). This is optionally because it makes Jemm behave not fully VCPI compliant, but shouldn't hurt usually. FASTBOOT option might allow a fast reboot. There is no guarantee that it will work, though, see hints in "Troubleshooting". FRAME=nnn instructs Jemm to use a certain page frame. Accepted are frame values from 8000 to E000 or NONE. FRAME=NONE disables the page frame, but there are quite some programs which won't run with this setting. Usually it's better to let Jemm find a page frame on its own, because choosing an address which is not free might cause a crash. I=mmmm-nnnn force Jemm to use a memory range for UMBs (or page frame). must be >= A000. Specifying a range which is not really free may give "unexpected" results. I=TEST scan ROMs for unused address space. This option will regard any 4 kB page containing identical byte values as "unused". LOAD installs Jemm from the command line. Be aware that UMBs cannot be provided this way, since DOS will ignore them. [MAX=]nnn limit the maximum amount of memory to be allocated for VCPI (and EMS, if is below 32 MB). The MAX= prefix is optional (a number found as option will be handled as if it has a MAX= prefix). MIN=nnn preallocates kB of XMS memory thus making sure this memory is truly available for EMS/VCPI. If MIN is higher than MAX, MAX will be adjusted accordingly. Default for is 0. NODYN disables XMS dynamic memory allocation. NOEMS disables EMS support. NOHI this option will prevent Jemm from moving its resident part into upper memory. If no UMBs are installed by Jemm, NOHI has no effect. NOINVLPG disables usage of INVLPG opcode on 80486+ cpus. Might be useful if Jemm runs in a virtual environment (see "Troubleshooting"). NOVCPI disables VCPI. Option can be set from the command line. PGE/NOPGE options will enable/disable the Page Global Enable feature on Pentium Pro+ cpus. This allows to mark all PTEs for the real-mode address space 0-110000h as "global", which gives a slight speed benefit for VCPI applications. Option is off by default because some DOS extenders will not work with PGE enabled. Also setting both PGE + NOINVLPG will not work. RAM/NORAM will instruct Jemm to supply UMBs or not. RAM is the default. NORAM is intended to be used when loading Jemm from the cmdline, in which case adding UMBs might be less useful. S=mmmm-nnnn add a memory region (which must be in range C800-EFFF) as UMB. The memory region has to be filled with Shadow-RAM activated by UMBPCI, which must have been loaded *before* Himem/JemmEx. NOTE: for Jemm386, instead of using "S=" one might as well use UMBM.EXE, which additionally allows to load the XMS host "high". SPLIT if ROMs are found which don't end exactly at a 4 kB boundary then setting this option will increase available UMB space. ROM sizes are defined in 0.5 kB units, so there might be up to 3.5 kB wasted in the ROM's last 4 kB page. There is a small catch: the full 4k page will be made writeable, including the ROM part. UNLOAD uninstalls Jemm from the command line. Uninstalling the EMM might confuse resident programs which rely on EMS or VCPI but didn't ensure this configuration to keep unchanged (by allocating an EMS page) while they are running. VCPI (re)enables VCPI. Option can be set from the command line. VERBOSE talk a bit more during the load process (abbreviation: /V). VME/NOVME options will enable/disable using the V86 Mode Extensions on Pentium+ CPUs. These options can be set from the command line. X=mmmm-nnnn exclude a memory range to be used as UMBs or page frame. must be >= A000. X=TEST will exclude all upper memory regions which contain byte values other than 00 or FF. JemmEx additionally understands: A20METHOD:x select A20 switch method. Possible values for : ALWAYSON Assume that A20 line is permanently ON BIOS Use BIOS to toggle the A20 line FAST Use port 92h, bypass INT 15h test PS2 Use port 92h, bypass PS/2 test KBC Use the keyboard controller PORT92 Use port 92h always HMAMIN=k set minimum amount in kB to get the HMA (default=0, max=63). MAXEXT=l limit extended memory controlled by XMM to kB. NOE801 don't use int 15h, ax=E801h to get amount of extended memory. NOE820 don't use int 15h, ax=E820h to get amount of extended memory. X2MAX=m limit for free extended memory in kB reported by XMS V2 (default 65535). It is reported that some old applications need a value of =32767. XMSHANDLES=n set number of XMS handles (default=32, min=8, max=128). 4. EMS Implementation Notes - The number of EMS pages is limited to 2048 (= 32 MB). It can be increased up to 32768 pages (= 512 MB) by setting MIN= to a value higher than 32 MB. However, this memory will then be preallocated, and not be available as XMS memory. Some applications will not work if EMS > 32 MB. - There is one memory pool, which is shared by EMS and VCPI. - The following EMS 4.0 functions aren't implemented. Calling these functions will return error code 84h in register AH: + Int 67h, AH=5Ch, prepare expanded memory manager hardware for warm boot + Int 67h, AH=5Dh, enable/disable OS/E 5. Emulation of privileged Opcodes To provide Expanded Memory an EMM Emulator like Jemm runs the cpu in so-called v86-mode. This mode does not allow to run privileged opcodes. Some of these opcodes which might be useful for application programs are emulated by Jemm, however. These are: - mov , ;special_reg = CRn, DRn, TRn - mov , ;reg = eax, ebx, ecx, edx, esi, edi, ebp - WBINVD - INVD - WRMSR - RDMSR - RDTSC 6. JLOAD and JLMs JLoad is an extension for Jemm (both Jemm386 and JemmEx) which allows to load JLMs (Jemm Loadable Modules). JLMs are 32bit protected-mode extensions suitable for various tasks. JLoad can be loaded as a device driver in CONFIG.SYS or from the command line. Run JLOAD.EXE to see the usage in details. In any case it requires a JLM to be loaded as parameter. JLoad has some knowledge about Jemm internals. Therefore the versions of Jemm and JLoad always must match, else JLoad will refuse to run. Two JLMs, XDMA32 and XCDROM32, are included. 6.1. XDMA32 - UltraDMA HD driver This JLM is based on Jack R. Ellis' XDMA Ultra-DMA HD driver. It supports PCI IDE controllers running in "legacy" or "native" mode. To load it, add the following line to your CONFIG.SYS: DEVICE=JLOAD.EXE XDMA32.DLL [options] options are: /L limits DMA to "low memory" below 640 kB. /Q quiet mode. /UF "ultra fast", uses DMA "scatter/gather" method to allow transfers which cross a physical 64 kB boundary. Might not work with all controllers, so use with care! (The "ultra fast" is a historical remnant, on modern systems there will be no significant difference in speed.) 6.2. XCDROM32 - UltraDMA CD-ROM/DVD driver This JLM is based on Jack R. Ellis' XCDROM Ultra-DMA CD-ROM driver. It supports PCI IDE controllers running in "legacy" or "native" mode. To load it, add the following line to your CONFIG.SYS: DEVICE=JLOAD.EXE XCDROM32.DLL [options] Options are: /AX disable "audio" functions. /D:name set device name. If this option is missing, the default device name is "XCDROM$$" /L limits DMA to "low memory" below 640 kB. /Mn set maximum UDMA mode (0 <= n <= 2) /Q quiet mode. /UF "ultra fast", uses DMA "scatter/gather" method to allow transfers which cross a physical 64 kB boundary. Might not work with all controllers. /UX disables UltraDMA for all drives and uses PIO instead. 7. Other Tools 7.1. UMBM UMBM is a small tool only useful if Jemm386 is used in conjunction with Uwe Sieber's UMBPCI. The purpose is to be able to load the XMM into upper memory. This driver must be loaded before Jemm386 and therefore cannot use UMBs provided by Jemm386. For JemmEx, UMBM is not needed, since it can be fully replaced by the S=XXXX option. How does UMBM work? It expects to find a "shadow" RAM region activated by UMBPCI. Then it installs inself as a temporary XMS host which just provides support for allocating UMBs. This is enough for most DOSes to grab the memory. After the UMBs have been allocated, UMBM will be removed from memory automatically. UMBs based on "shadow" RAM, as it is supplied by UMBPCI+UMBM, may have limitations depending on the motherboard's chipset. Very often the memory is inaccessible for DMA. Read the documentation coming with UMBPCI for more details. Enter "UMBM" on the command line and read the example how to add UMBM to CONFIG.SYS. UMBM has been tested to run with MS-DOS 6/7 and FreeDOS. 7.2. JEMFBHLP JEMFBHLP is a tiny device driver only needed if both FreeDOS and Jemm's FASTBOOT option are used. FreeDOS does not provide the information which Jemm needs for FASTBOOT to work, so this driver tries to cure FreeDOS' incapability. It saves the values for interrupt vectors 15h and 19h at 0070h:0100h, which is the MS-DOS compatible way to do it. 7.3. EMSSTAT EMSSTAT can be used to display the current status of the installed EMM. It works with any EMM, not just Jemm. 8. Troubleshooting, Hints þ If Jemm halts or reboots the machine, the following combinations of parameters may help to find the reason. Generally, Jemm386 should be loaded immediately after the XMM (HIMEMX.EXE, HIMEM.SYS), and the XMM itself should be the first device driver to be loaded. For testing, it might also help to prevent DOS from loading in the HMA and/or not to use UMBs at all. - X=A000-FFFF NOHI NOVME NOINVLPG This is the safest combination. If this doesn't work, Jemm most likely isn't compatible with the current DOS/BIOS. - X=TEST NOHI NOVME NOINVLPG This is slightly less safe, since Jemm will scan the upper memory region to find "unused" address ranges usable for UMBs. If this doesn't work, one has to manually set X=xxxx-yyyy to finally find the region which causes the troubles. þ Jemm has been verified to run on the following virtual environments: Qemu, Bochs, VirtualBox, VMware, VirtualPC However, it might be necessary to set options NOINVLPG and/or NOVME. þ Some DOS programs will not work if EMS is enabled without a page frame. þ The JEMM ;-) DOS Extender (used for "Strike Commander" and "Privateer") requires the NOVME option to be set. This requirement is a strong sign that this extender switches to V86 mode on its own, which is a bad idea for a VCPI client. þ The FASTBOOT option can work with many versions of DOS. However, additional settings might be needed: - FreeDOS may require to set STACKS=0,0 in CONFIG.SYS. Also the XBDA most likely must not be moved. - FreeDOS additionally needs JEMFBHLP.EXE to be installed prior to the XMM (Himem). Possibly this might also be needed for MS-DOS versions < 5. þ If Jemm is installed from the commandline, loading the CTMOUSE driver v1.9x and v2.0x might cause an exception. Adding option NOHI or NORAM when installing Jemm should avoid that. In CTMOUSE v2.1 the bug has been fixed. þ FreeDOS regrettably accepts just one UMB provider. This makes it impossible for example to use UMBM.EXE to supply UMB D000-DFFF and then tell Jemm to additionally supply B000-B7FF as UMB. MS-DOS has no such problems. þ Although including the region B000-B7FF might work in most cases, one should be aware that this region is not really free, it's used by the VGA "monochrome" video modes. þ To make Jemm behave (almost) like MS Emm386 regarding UMBs one should set both options X=TEST and I=TEST. þ The NOVCPI option may be used to setup an environment similiar to Windows DOS boxes: - install Jemm with VCPI enabled - install a DPMI host residently (HDPMI, DPMIONE, ...) - disable VCPI with the NOVCPI option This forces any DOS extended application to either use DPMI or abort. 9. History 12/03/2007: v5.68 - bugfix: JLOAD's "Lock DMA" function ignored flag to check for 64 kB border crossing. - NMIs occuring inside the monitor are now silently routed to v86-mode. Previous Jemm versions displayed an exception dump. - XDMA32 added, supports "legacy" and "native" IDE controllers. - XCDROM32 now supports "legacy" and "native" IDE controllers. - some bugfixes in XCDROM32. 10/13/2007: v5.67 - bugfix: I=TEST always scanned 4 kB chunks, although the last page of a ROM might be smaller (512, 1024, ... bytes). - bugfix: if I=TEST found an "unused" page in a ROM, v5.64-5.66 messed up an internal counter. As a result, there was a small risk that the begin of another ROM following this one in the address space wasn't detected. - error code displayed in exception dump. - selected A20 method now displayed in "verbose" mode only. - tool EMSSTAT.EXE added. 08/24/2007: v5.66 - bugfix: GDT, which has been moved to nonshared space in v5.6, moved to shared space again. Required by applications written for the Phar Lab TNT DOS extender. 08/19/2007: v5.65 - Standard reboot handler made fully MS Emm386 compatible. The ALTBOOT option is now a dummy. - auto-scanning for a page frame will now ensure that the frame begins on a 16 kB boundary. This is MS Emm386 compatible. 07/12/2007: v5.64 - bugfix: for FASTBOOT, IVT vectors 78h-7Fh should be reset to 0000:0000. This wasn't done. - SPLIT option added. 06/22/2007: v5.63 - bugfix: NOEMS didn't disable EMS in v5.62 - bugfix [JemmEx only]: MAXEXT option wasn't displayed in help screen. 06/19/2007: v5.62 - bugfix: int 67h, ah=5301h (set handle name) didn't check if this name was already assigned (and return status A1h if yes). - bugfix: using I=TEST might have reduced amount of UMBs by 4 kB. - bugfix: in v5.61, Int 67h, ax=5900h still returned 8 as mapping context size, which usually is too small now (physical pages are > 4). - bugfix: in v5.61, if Jemm was loaded from the command line and remained in low memory, it didn't hook into the driver chain. - bugfix: in v5.61, there was a risk that Jemm386 didn't install an UMB handler (and then the UMBs were "lost"). - int 67h, ah=5Bh implemented (alternate map register sets). - the EMS system handle is now populated with the mappable pages below A000h, as described in EMS 4.0 docs (and also done by MS Emm386). 06/04/2007: v5.61 - bugfix: Int 67h, ah=51h (EMS reallocate) might have failed to increase the handle's pages although there were enough free pages available. This was a design flaw. Now for each EMS handle a linked lists of allocated pages is maintained. - bugfix: trying to release the NULL handle will now reallocate it with size 0. This is the behavior specified in the EMS docs. - bugfix: there was a chance that 4 VCPI pages got lost. They could be allocated, but weren't found anymore when trying to release them. - bugfix: memory for UMBs is no longer contained in EMS system handle 0. This handle should only contain pages which "backfill" conventional memory (segment addresses below A000h). - bugfix: int 67h, ah=56h (alter page map and call) ignored the "old" member in the "map_and_call" parameter. - value of GDTR, IDTR and TR exposed by Jemm. This allows JLoad to avoid usage of opcodes SGDT/SIDT, which caused problems with most virtualizers. - allocating a 4kB page with VCPI is now significantly faster. - B=xxxx parameter supported. Pages 4000-9FFF are mappable by default. 05/24/2007: v5.6 - bugfix: if Jemm had to emulate an IRET in v86-mode and the copy of the flag register onto the stack was "invalid" (IOPL != 3), a GPF occured at the next IO-sensitive instruction in v86-mode. - bugfix [JemmEx only]: NODYN option caused a GPF on initialization. - dword and string I/O now simulated correctly for trapped port access. - GDT and IDT moved to nonshared memory. - the ring 0 stack has been increased to 4 kB and moved to nonshared space. This allows "nested execution" without using the client's v86-stack. - JLOAD.EXE added. Jemm splitted in 2 packages: binaries and source. Some sample JLMs added (XCDROM32, KEYBGR, ...). - new EMMXXXX0 function exposes some of Jemm's internal call tables, thus allowing external modules (JLOAD) to implement a 32bit ring 0 API. - switched to a table-oriented IO-port trapping implementation, which allows external modules (JLOAD) to hook/take over port trapping. 05/04/2007: v5.52 - bugfix: a bug introduced in v5.5 caused garbage to be displayed if option I=B000-B7FF was used. 05/03/2007: v5.51 - bugfix [JemmEx only]: XMS memory realloc function (ah=0Fh) caused the stack not to be dword-aligned, which slows things down and might cause troubles if an interrupt occurs during a memory block move. - JemmEx: EMS block moves (int 67h, ah=57h) now also done with interrupt window if client's IF is set. 04/29/2007: v5.5 - bugfix: if Ctrl-Alt-Del was pressed with FASTBOOT active and an event proc for the PS/2 mouse was set, a crash might have occured. Now the PS/2 mouse is reset by Jemm before rebooting. - bugfix: S=XXXX was ignored if it was the only region to be added as UMBs. - in v5.46, FASTBOOT only worked by pressing Ctrl-Alt-Del. Now it should work as well if int 19h is called. - in v5.46, FASTBOOT always needed ALTBOOT to be set and therefore has set this option internally. This is no longer done. - JEMMEX.EXE added. - JemmEx opens interrupt window in block moves (int 15h, ah=87h and XMS function ah=0Bh) each 8 kB if client's IF is set. 03/27/2007: v5.46 - bugfix: free EMS pages not always reported correctly. - bugfix: translation DMA for 16-bit controller (channels 4-7) didn't work. - bugfix: Jemm always displayed "can't continue, please reboot" on invalid opcode exceptions in v5.45. - MIN= no longer restricted to a maximum of 512 MB (EMS pages still are). - FASTBOOT option implemented, JEMFBHLP.EXE added. 03/02/2007: v5.45 - bugfix: in v5.40, if no option was entered when installing Jemm, it might have displayed some garbage. - bugfix: invalid opcode generated by Jemm if running on a cpu < 80386. - bugfix: XMS function 11h (free UMB) always returned an error. - option UNLOAD added. - option RAM/NORAM implemented. - valid range for page frame set with FRAME=xxxx now 8000-E000. - the MAX= prefix can be omitted now. Makes the cmdline more MS Emm386 compatible. - memory required for UMBs will no longer reduce the memory available for EMS. This is similiar to what MS Emm386 does. - installing Jemm from the command line now prohibited if a DPMI host is detected. 02/20/2007: v5.4 - some minor bugfixes. - Jemm now moves its resident part to the first UMB which it supplies. - NOHI option implemented. - Jemm now uses the true (=zero-based) flat memory model. 01/11/2007: v5.34 - bugfix: Jemm always hooked int 15h, ah=4Fh, thus always acting as if option ALTBOOT was set (bug introduced in v5.25). 01/06/2007: v5.33 - bugfix: Jemm erroneously might have disabled EMS - reboot code slightly changed, there were still some machines (old 80486?) were Ctrl-Alt-Del didn't work. 11/13/2006: v5.32 - removed an optimisation which PKZIP didn't like. 11/09/2006: v5.31 - some minor bugfixes in function int 67h, ah=57h. - bugfix: wrong register contents were displayed in v5.30 for exceptions occuring in protected-mode. - v86-mode int 06 handler moved to protected-mode, thus further reducing Jemm's conventional memory usage. 10/27/2006: v5.30 - bugfix: int 67h, ah=57h (move/exchange memory region) didn't always invalidate the TLB cache for the EMS memory to copy/exchange. - bugfix: int 67h, ax=4F01h didn't work. - int 67h, ah=55h/56h implemented. - int 67h, ah=57h now works with overlapping memory regions. Furthermore it is now ensured that all EMS pages involved in the copy operation are valid before copy actually begins. 10/24/2006: v5.29 - bugfix: the error msg when the EMS call to map UMBs failed contained garbage as "function". - int 67h, AH=58h will now return success even with NOEMS. - now error code 80h, not 91h is returned if functions int 67h, ah=41h or 47h or 48h are called and no page frame is defined. - NOINVLPG option added. - I=TEST is now a bit less restrictive and will increase compatibility with MS-Emm386. - help text displayed by Jemm adjusted where it was wrong or unclear. 10/13/2006: v5.28 - bugfix, VDS function scatter/gather lock (int 4Bh, ax=8105h): if lower 12 bits of offset in EDDS were <> 000h, this function always returned the first page as a separate region. - bugfix, VDS function scatter/gather lock: if this function failed with AL=9, it did not always set the correct value for items required to describe the full region. - bugfix: int 67h, ah=53h (get/set handle name) and ah=54h (get handle directory) wrongly assumed that they won't be called with handles other than 0000 if NOEMS is set. - bugfix: int 67h, ah=57h (move/exchange memory region) didn't work without a page frame (NOEMS or FRAME=NONE). 10/07/2006: v5.27 - bugfix: allocating a EMS block with zero pages (int 67h, ah=5Ah, bx=0) returned with AH=0, but did not return a valid handle in DX. - bugfix: calling int 67h, AH=51h modified AL register. 09/30/2006: v5.26 - bugfix: VDS functions 03, 04, 07 and 08 may have failed if bit 1 of DX was set (request to copy in/out of DMA buffer) and registers BX,CX were <> 0. - bugfix: 1 kB of DMA buffer may have been inaccessible. - bugfix: releasing a DMA buffer with size > 0 and < 1 kB always failed. 09/22/2006: v5.25 - bugfix: if option ALTBOOT is set and Ctrl-Alt-Del being pressed has been detected, then the real-mode int 15h chain is called first before rebooting. This gives other hookers (SmartDrv) a chance to cleanup. 09/19/2006: v5.24 - bugfix: int 67h, ax=5001h (implemented in v5.2) didn't work. - bugfix: setting Jemm options from the command line did reset the options which were not explicitely entered. - PGE/NOPGE options added. 09/14/2006: v5.23 - bugfix: if the amount of preallocated EMS memory (MIN=xxxx) was not below largest XMS memory block - 384 kB, the amount of free/ available EMS pages reported by Jemm was up to 384 kB too large. - implemented VDS function 05 (scatter lock) returning PTEs instead of "regions". This makes Jemm fully support the VDS API. - some message texts adjusted to make it clear what is an error, a warning or just informational. - warning about detected system memory region now displays all such regions, start and size. - if wanted EMS memory has to be reduced, a warning is displayed. - UMBM.EXE added. - EMX option added. 09/09/2006: v5.22 - bugfix: the DMA buffer 64kb alignment may cause up to 32 kB to be lost for EMS/VCPI memory. This wasn't taken into account, and may have resulted in Jemm unable to alloc UMBs if options NODYN and MIN= were set. - bugfix: in displayed text "wanted preallocated EMS memory kB" was always blank. - space for UMBs now rounded up to next 16 kB boundary (previously it was rounded to 32 kB). 09/07/2006: v5.21 - bugfix: in v5.2 if an invalid command line parameter was entered, the program displayed garbage. - bugfix: in v5.2 options setting both options NOEMS and NOVCPI might have caused Jemm to run out of memory for UMBs. - XMS dynamic memory allocation was automatically disabled if NOEMS and NOVCPI options were set, but this is no longer useful since option NODYN exists and VCPI can be dynamically set/reset from the command line. - DMA buffer size now always rounded up to a full 4 kB boundary. - LOAD option added which allows to install Jemm from the command line. 09/06/2006: v5.2 - bugfix: writing to "ROM" page FF000 if ALTBOOT wasn't set caused a crash. - bugfix: if XMS handle array was in HMA and A20 got disabled results may have been "unexpected". - bugfix: "disable A20 local" emulation did not return an error code if count was already 0. - there was slightly more XMS memory allocated than required. - support for Int 67h, ax=5001h implemented. - option MIN= no longer deactivates XMS dynamic memory allocation. option NODYN added, option EMM= discarded. - If XMS memory must be preallocated (because XMS host doesn't export its handle table) and MIN= option is not set, Jemm allocates half of extended memory (but not more than 32 MB) for EMS/VCPI memory. - Assembler: MASM may be used instead of TASM. - Compiler: Open Watcom WCC or MS VC 1.5 may be used instead of TC. - Linker: Digital Mars OPTLINK may be used instead of TLINK. - protected-mode code switched to 32-bit. - port trapping added to the A20 enable/disable emulation. XMS hook is still required due to the "A20 always on" case, which causes most XMS hosts not to touch the ports at all. 08/30/2006: v5.1 - bugfix: the DMA master mask register was read, which doesn't work on all machines and may have caused an "illegal instruction exception" if the floppy disk was accessed. This bug was introduced in v5.00. - bugfix in EMS function 4Eh. - bugfix: A20 emulation works now if no UMB handler has been installed. - DMA buffer size may be set by commandline option. - VDS functions 07/08 (request/release DMA buffer) and 09/0A (copy into/out of DMA buffer) implemented. VDS functions 03/04 (lock/unlock region) extended so that they call functions 07/08 if needed. - NOVCPI does no longer require NOEMS. - ALTBOOT (re)implemented, it hooks int 15h, ah=4Fh now. - VME mode may now be set/reset with VME/NOVME options. - LIBM.LIB no longer needed to create the JEMM386.EXE binary. 08/25/2006: v5.01 - bugfix: "A20 enabled"-count was 0 on startup, should have been 1. - bugfix: unsupported VDS functions caused a debug display, which didn't work and may have caused corruption of monitor data. Debug displays removed. - bugfix: original int 4Bh vector may have been 0000:0000 - if this is true, it must never be chained to of course. Instead carry flag is set. - VDS functions 0Bh and 0Ch (disable/enable translation) implemented. 08/23/2006: v5.00 - EMMXXXX0 device communication implemented - bugfix: DMA buffer is ensured to begin on a 64 kB physical address boundary. - bugfix: XMS handles which are no longer used now get the "in pool" flag set, not the "free" flag. - Pentium+ VME extensions supported. - A20 disable emulation activated. 08/17/2006: v5.00pre - bugfix: in VCPI protected mode entry switch to host stack before context is switched. - command line option S=xxxx added. - option NOALTBOOT deleted. - the full physical memory is no longer mapped in the address space. This reduces extended memory usage a lot on machines with large amounts or RAM, since no page tables are needed. - VDS code moved to extended memory, reducing conventional memory usage by about 1 kB. 10. License - JEMM386.EXE/JEMMEX.EXE: Artistic License (see LICENSE.TXT for details) - UMBM.EXE: Public Domain - JEMFBHLP.EXE: Public Domain - JLOAD.EXE: FreeWare - EMSSTAT.EXE: FreeWare - XDMA32.DLL, XCDROM32.DLL: GNU GPL v2 (see GNU_GPL.TXT for details) Binaries and source are distributed in separate packages. The binaries' package has a 'B' suffix in its name, the package containing the source has a 'S'. Japheth