
 1. About JLoad and JLMs

 JLoad is an extension for Jemm (both Jemm386 and JemmEx) which allows to
 load 32bit flat protected-mode modules ( called "Jemm Loadable Module", 
 JLM ) into Jemm's address space.
 
 JLMs can be used for various tasks, for example:

 - implement a protected-mode version of a DOS device driver.
 - implement a protected-mode version of a DOS TSR.
 - provide services for other JLMs (kind of a ring 0 dll).
 - run as a ring 0 protected-mode application which will
   be unloaded automatically after it has its job done.
 - emulate hardware by trapping I/O port access.

 A JLM is supposed to be loaded by JLoad, either as a device driver in
 CONFIG.SYS, or from the command line. The syntax is:

 [DEVICE=]JLOAD.EXE [ options ] name_of_JLM [arguments for JLM]

 The name of a JLM is always required as parameter. Options are:

   -q:  quiet mode.
   -u:  unload a JLM.

 To be able to unload a JLM, several conditions must be true. First, the 
 JLM must export a so-called DDB. Second, the DDB must contain a valid 
 "Device Id". And third, the JLM must not refuse to be unloaded.

 Note: currently  the versions of Jemm and JLoad always must match, else
 JLoad will refuse to do anything.

 Two JLMs, XDMA32 and XCDROM32, are included in the Jemm binary package.
 For more details about these modules see XDMA32.TXT and XCDROM32.TXT.


 2. Technical Details about JLMs

 JLMs must be non-segmented and linked as Win32 PE binaries. But despite the
 similiarities, JLMs should not be confused with such binaries. Some of the
 differences are:

 - JLMs always run in ring 0 protected-mode.
 - there is no Win32 API (and also no DOS/DPMI API) available.
 - JLMs cannot be linked with Win32 import libraries.

 Because of the fundamental differences, JLMs must be patched after the
 link step (with tool PATCHPE). Thus they aren't recognised anymore as Win32
 binaries.

 The only API JLMs can use directly is the one installed by JLoad, which more
 or less is a small subset of the Windows 3x/9x VMM API. This API usually is
 invoked by an INT 20h opcode, followed by two words which determine the
 module and function to be called. The API also allows "nested execution",
 that is, a JLM can indirectly call BIOS or other software interrupts outside
 of the client's context. For details about what functions are implemented
 see files JLM.INC or JLM.H.

 There is a strong similiarity between JLMs and Windows 3x/9x VxDs, but there
 are also some major differences:

 - Jemm does not support Virtual Machines (VMs) currently.
 - Jemm has no integrated DPMI host. Therefore the client will always be in
   V86-mode. DPMI applications can run only outside of Jemm's context with
   the help of an external DPMI host which runs as VCPI client.
 - JLMs run with interrupts disabled. If they do a lengthy operation or have
   to wait, they must "yield" to allow interrupts to be serviced.


 3. Documentation about JLoad's API

 A detailed documentation about the functions implemented by JLoad can be
 found in:

 - Win95 DDK, file VMM.HLP
 - Win98 DDK, file OTHER.CHM
 - Win2k DDK, file OTHER.CHM


 4. Using 386SWAT

 Jemm is compatible with the 386SWAT ring 0 debugger. This debugger is also
 the best choice to find errors in JLMs. However, to catch the most common
 type of errors in protected-mode - GPFs - with 386SWAT, one has to tell
 386SWAT which GPFs are "expected" and which are not. The following line in
 386SWAT.PRO should do the trick:

 GPSKIP=HLT,INI,IND,INS,OUTI,OUTD,OUTS,CRn


 5. History

 v5.76:
   - linker changed from Digital Mars OPTLINK to jwlink
   - VMM.ASM: bugfix in _PageFree()
 v5.73:
   - bugfix: Hook_V86_Int_Chain might have messed the stack.
   - automatically alloc/free V86 breakpoint if v86 API is to be
     installed by a device. 
   - when the first v86 API is installed, v86 int 2Fh is hooked to
     handle ax=1684h.
   - Option -u added.
 v5.72:
   - switched to JWasm assembler
 v5.71:
   - bugfix: in v5.70, JLoad's assumtion about location of Jemm's TSS
     was wrong.
 v5.69:
   - both '-' and '/' accepted for switches.
   - MoveMemory added to Jemm's service table.
   - DMA copy to/from buffer functions added.
 v5.68:
   - bugfix: DMA lock ignored flag to check for 64 kB border crossing.
 v5.60:
   - initial.


 6. License

 JLoad is FreeWare and can be redistributed.

 Japheth

