So... Since these games rely on isa dma being able to select a region of memory the cpu can actually talk to (which is limited to a 1mb space on an 8088/8086), and the game *cannot know* what this chunk of memory's physical address will be without the XMM telling it so, a kludge presents itself.
The XMM reports the location of the EMS pageframe for servicing these DMA calls, rather than a logical XMS virtual address. It uses the virtual address to keep track of which EMS page needs to be in the frame, and ensures that this page is active before DMA triggers. The DMA reads from the frame, then ends. It gets the expected data, and nobody has to know different.
On an 8086 system, the xms locked location cannot be outside 1mb, because there are not any physical address lines above this for the dma controller to even assert.
Trapping for 'above 1mb' on xms lock requests, and keeping some housekeeping data about this for just 'in time' page switches 'might work'?
Eg, for addresses above 1mb, the XMM reports an address for the locked block that, if you strip off the top address bits (because there are no lines to carry them anyway!) 'Just so happens' to be the address of the pageframe in the 1mb space.
The DMA chip accepts the address bits its actually capable of servicing, and reads from the pageframe.
??
There isn't a real reason the XMS memory reported by this manager has to be 'contiguous'. 'Memory hole at 16mb' was a real thing on AT machines, after all.