INT 15H 87H: Move Memory Block

                                                                        [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)
          BIOS Data Area
          ROM-BIOS Functions
                                    -♦-