[AT]
Expects: AH    87H
CX    amount of memory to move, in 2-byte words (max 8000H words)
ES:SI address of 30-byte structure describing the operation
                                                                  
Returns: AH    00H = successful move
01H = RAM parity error occurred
02H = other exception interrupt error occurred
CF    NC (0) no error
CY (1) some sort of error
ZF    NZ (0) error; unsuccessful move
ZR (1) successful move
                                                                  
Info: You can use this to move chunks of memory around, even when you
are running in real mode (access to RAM above 1MB is normally
accessible only when in 80286 protected mode).

Note: Only old programs use this BIOS interface.  It is much better to
use XMS Functions or the DPMI API to access RAM above 1MB.

ES:BX The caller must supply a 30-byte data record which will be used
as a GDT (Global Descriptor Table).  This is used to translate
between 32-bit addresses and 24-bit addresses.  It is laid out as
follows:

MoveMemGdtRec
Offset Size Contents
                                                               
+0      8  res1      8 bytes of 0
+8      8  res2      this GDT (filled-in by BIOS)
+10H     2  wLimits   source block limits (filled-in by BIOS)
+12H     3  p24Source 24-bit physical address of block to copy
+15H     5  res3      (filled-in by BIOS)
+1aH     3  p24Dest   24-bit physical address of destination
+1dH    19  res4      (filled-in by BIOS)
30            size of buffer

You need only fill-in the p24Source and p24Dest with 24-bit
physical memory addresses.  Physical memory addresses are linear
and can range from 000000H to ffffffH (i.e., up to 16 MB).

Notes: Interrupts are disabled during block moves.  Therefore, use of
this fn can interfere with serial I/O or other interrupt-driven
tasks.

See Also: INT 15H (extended AT services)
- -

INT 15H 87H: Move Memory Block