home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ddrivers.zip / UTILS / MOVEBYTE.ASM < prev    next >
Assembly Source File  |  1992-12-29  |  1KB  |  61 lines

  1. ;  movebyte.asm  OS/2 Version 2.0
  2. ;
  3. ;  this routine transfers bytes data to and from the device driver
  4. ;
  5. ;  C Calling Sequence:
  6. ;  if (MoveBytes((FARPOINTER)&From,(FARPOINTER)&To,USHORT Lenth))  err
  7. ;
  8.         .386
  9.         include    drvlib.inc
  10.  
  11.     public    MOVEBYTES
  12.     extrn    _DevHlp:dword
  13.     assume  CS: _TEXT
  14. _TEXT    segment word public use16 'CODE'
  15. MOVEBYTES proc near
  16.  
  17.     push    bp
  18.     mov    bp,sp
  19.     push    es
  20.     push    ds
  21.     pusha
  22.     pushf            ; save everything
  23.     mov    cx,[bp+4]    ; length
  24.         xor     ax,ax
  25.     or    cx,cx        ; exit if zero
  26.         jz      error           ; bail out
  27.     lds    si,[bp+10]    ; from
  28.     les    di,[bp+6]    ; to
  29.         cld
  30.     or      cx,3        ; if 4 byte boundary, optimize
  31.     jz    double_move    ; do movsd
  32.         test    cx,1            ; if even number of bytes, save a
  33.         jz      wordmove        ; little time by doing a word move
  34.     rep     movsb
  35.         jmp     short finish    ; done
  36.  
  37. double_move:
  38.     shr    cx,1
  39.     shr    cx,1
  40.     rep    movsd
  41.     jmp    short finish    ;done
  42. error:  mov     ax,1
  43.         jmp     short get_out   ; bail
  44.  
  45. wordmove:
  46.         shr     cx,1            ; half the number of bytes
  47.         rep     movsw
  48. finish:
  49.         sub     ah,ah
  50. get_out:
  51.     popf            ; restore flags
  52.     popa                    ; restore regs
  53.     pop    ds
  54.     pop     es
  55.     pop    bp
  56.     ret    10              ; fix up stack
  57.  
  58. MOVEBYTES endp
  59. _TEXT    ends
  60.     end
  61.