home *** CD-ROM | disk | FTP | other *** search
/ Internet MPEG Audio Archive / IMAA.mdf / util / dos / l3v100n / rsx / source / copy32.asm < prev    next >
Assembly Source File  |  1994-01-19  |  7KB  |  349 lines

  1. ;
  2. ; COPY32.ASM (c) Rainer Schnitker 92,93
  3. ;
  4.  
  5. ;
  6. ; copy to or from 32bit segments
  7. ;
  8.  
  9.     .386p
  10.  
  11. DGROUP group _DATA
  12.  
  13. _DATA segment word public 'DATA' use16
  14. _DATA ends
  15.  
  16. _TEXT segment byte public 'CODE' use16
  17.         assume cs:_TEXT,ds:DGROUP
  18.  
  19.  
  20.     ;
  21.     ; void store32(WORD ds,DWORD offset,DWORD value)
  22.     ;
  23. public _store32
  24. _store32 proc near
  25.     ; stack: 4 = WORD ds32, 6 = DWORD off32, 10 = DWORD value
  26.     push    bp
  27.     mov    bp,sp
  28.         push    ds
  29.     push    ebx
  30.         push    eax
  31.     mov    ax,word ptr [bp+4]        ; get user ds
  32.         mov     ds,ax
  33.     mov    eax,dword ptr [bp+6]        ; get user offset
  34.     mov    ebx,dword ptr [bp+10]        ; get value
  35.     mov    [eax],ebx
  36.         pop     eax
  37.     pop    ebx
  38.         pop     ds
  39.     leave
  40.         ret
  41. _store32 endp
  42.  
  43.  
  44.     ;
  45.     ; DWORD read32(WORD ds,DWORD offset)
  46.     ;
  47. public _read32
  48. _read32 proc near
  49.     ; stack: 4 = WORD ds32, 6 = DWORD off32
  50.         push    bp
  51.     mov    bp,sp
  52.         push    ds
  53.     mov    ax,word ptr [bp+4]        ; get user ds
  54.         mov     ds,ax
  55.     mov    eax,dword ptr [bp+6]        ; get user offset
  56.         mov     edx,[eax]
  57.     movzx    eax,dx                ; convert result
  58.     shr    edx,16                ; in DX:AX
  59.         pop     ds
  60.     leave
  61.     ret
  62. _read32 endp
  63.  
  64.  
  65.     ;
  66.     ; void bzero32(WORD ds,DWORD offset,DWORD size)
  67.     ;
  68. public _bzero32
  69. _bzero32 proc near
  70.     ; stack: 4 = WORD ds32, 6 = DWORD off32, 10 = DWORD bytes
  71.     push    bp
  72.     mov    bp,sp
  73.         push    es
  74.         push    esi
  75.         push    edi
  76.     push    ecx
  77.  
  78.     mov    ax,word ptr [bp+4]        ; get user ds
  79.     mov    es,ax
  80.     mov    edi,dword ptr [bp+6]        ; get user offset
  81.     mov    ecx,dword ptr [bp+10]        ; get size
  82.     xor    eax,eax             ; store 0
  83.         cld
  84.  
  85.         rep
  86.     db 067h                 ; use es:edi
  87.         stosb
  88.  
  89.         pop     ecx
  90.     pop    edi
  91.         pop     esi
  92.         pop     es
  93.     leave
  94.     ret
  95. _bzero32 endp
  96.  
  97.  
  98.     ;
  99.     ; void cpy16_32(WORD ds,DWORD off,void *off16,DWORD size)
  100.     ;
  101. public _cpy16_32
  102. _cpy16_32 proc near
  103.     ; stack: 4 = ds32, 6 = DWORD off32, 10 = p16, 12 = DWORD bytes
  104.     push    bp
  105.     mov    bp,sp
  106.         push    es
  107.         push    esi
  108.         push    edi
  109.     push    ecx
  110.  
  111.     mov    ax,word ptr [bp+4]        ; get user ds
  112.     mov    es,ax                ; dest = ES:EDI
  113.     mov    edi,dword ptr [bp+6]        ; get user 32bit offset
  114.     movzx    esi, word ptr [bp+10]        ; source offset (DS:SI)
  115.     mov    ecx,dword ptr [bp+12]        ; get size
  116.         cld
  117.  
  118.     push    ecx
  119.     shr    ecx,2
  120.     jecxz    @byte_cpy16_32
  121.         rep
  122.         db 067h                                 ; use es:edi
  123.     movsd
  124.  
  125. @byte_cpy16_32:
  126.     pop    ecx
  127.     and    ecx,dword ptr 3
  128.     jecxz    @end_cpy16_32
  129.     rep
  130.     db 067h                 ; use es:edi
  131.     movsb
  132.  
  133. @end_cpy16_32:
  134.     pop    ecx
  135.     pop    edi
  136.         pop     esi
  137.         pop     es
  138.     leave
  139.     ret
  140. _cpy16_32 endp
  141.  
  142.  
  143.     ;
  144.     ; void cpy32_16(WORD ds,DWORD off,WORD ds16,WORD,off16,DWORD size)
  145.     ;
  146. public _cpy32_16
  147.     ; stack: 4 = WORD ds32, 6 = DWORD off32, 10 = p16, 12 = DWORD bytes
  148. _cpy32_16 proc near
  149.     push    bp
  150.     mov    bp,sp
  151.         push    ds
  152.     push    es
  153.         push    esi
  154.         push    edi
  155.     push    ecx
  156.  
  157.     mov    ax,ds
  158.     mov    es,ax                ; dest segment
  159.     movzx    edi, word ptr [bp+10]        ; get dest 16bit offset
  160.     mov    ax,word ptr [bp+4]        ; get user ds
  161.     mov    ds,ax                ; source = DS:ESI
  162.     mov    esi,dword ptr [bp+6]        ; get user 32bit offset
  163.     mov    ecx,[bp+12]            ; get size
  164.         cld
  165.  
  166.     push    ecx
  167.     shr    ecx,2
  168.     jecxz    @byte_cpy32_16
  169.         rep
  170.         db 067h                                 ; use es:edi
  171.     movsd
  172.  
  173. @byte_cpy32_16:
  174.     pop    ecx
  175.     and    ecx, dword ptr 3
  176.     jecxz    @end_cpy32_16
  177.     rep
  178.     db 067h                 ; use es:edi
  179.     movsb
  180.  
  181. @end_cpy32_16:
  182.     pop    ecx
  183.     pop    edi
  184.         pop     esi
  185.     pop    es
  186.         pop     ds
  187.     leave
  188.     ret
  189. _cpy32_16 endp
  190.  
  191.  
  192.     ;
  193.     ; void strcpy16_32(WORD ds,DWORD off,WORD ds16,WORD,off16)
  194.     ;
  195. public _strcpy16_32
  196. _strcpy16_32 proc near
  197.     ; stack: 4 = WORD ds32, 6 = DWORD off32 , 10=word p16
  198.     push    bp
  199.     mov    bp,sp
  200.         push    es
  201.         push    esi
  202.         push    edi
  203.  
  204.     mov    ax,word ptr [bp+4]        ; get user ds
  205.     mov    es,ax                ; dest = ES:EDI
  206.     mov    edi,dword ptr [bp+6]        ; get user 32bit offset
  207.     movzx    esi,word ptr [bp+10]        ; source offset (DS:SI)
  208.         cld
  209.  
  210. @cp16_32:
  211.         db 067H                 ; use edi,esi
  212.         lodsb                   ; copy ds:esi -> es:edi
  213.         db 067H                 ; use edi,esi
  214.         stosb
  215.         or al,al
  216.     jnz @cp16_32
  217.  
  218.         pop     edi
  219.         pop     esi
  220.         pop     es
  221.     leave
  222.     ret
  223. _strcpy16_32 endp
  224.  
  225.  
  226.     ;
  227.     ; void strcpy32_16(WORD ds,DWORD off,WORD ds16,WORD,off16)
  228.     ;
  229. public _strcpy32_16
  230. _strcpy32_16 proc near
  231.     ; stack: 4 = WORD ds32, 6 = DWORD off32 ,10 = WORD p16
  232.     push    bp
  233.     mov    bp,sp
  234.         push    ds
  235.         push    esi
  236.         push    edi
  237.  
  238.     mov    ax,ds
  239.     mov    es,ax                ; dest segment
  240.         movzx   edi, word ptr [bp+10]           ; get dest offset
  241.     mov    ax,word ptr [bp+4]        ; get user ds
  242.     mov    ds,ax                ; source = DS:ESI
  243.     mov    esi,dword ptr [bp+6]        ; get user offset
  244.         cld
  245.  
  246. @cp32_16:
  247.     db 067H         ; use edi,esi
  248.         lodsb                   ; copy ds:esi -> es:edi
  249.         db 067H                 ; use edi,esi
  250.         stosb
  251.         or al,al
  252.     jnz @cp32_16
  253.  
  254.         pop     edi
  255.         pop     esi
  256.         pop     ds
  257.     leave
  258.     ret
  259. _strcpy32_16 endp
  260.  
  261.     ;
  262.     ; void getstr(WORD ds,DWORD off,WORD ds16,WORD,off16,BYTE c)
  263.     ;
  264. public _getstr32_16
  265. _getstr32_16 proc near
  266.     ; stack: 4 = WORD ds32, 6 = DWORD off32 ,10 = WORD p16, 12 = BYTE c
  267.     push    bp
  268.     mov    bp,sp
  269.         push    ds
  270.         push    esi
  271.         push    edi
  272.  
  273.     mov    ax,ds
  274.     mov    es,ax                ; dest segment
  275.         movzx   edi, word ptr [bp+10]           ; get dest offset
  276.     mov    ax,word ptr [bp+4]        ; get user ds
  277.     mov    ds,ax                ; source = DS:ESI
  278.     mov    esi,dword ptr [bp+6]        ; get user offset
  279.     mov    cl, byte ptr [bp+12]        ; get delim
  280.         cld
  281.  
  282. @get32_16:
  283.     db 067H         ; use edi,esi
  284.         lodsb                   ; copy ds:esi -> es:edi
  285.         db 067H                 ; use edi,esi
  286.         stosb
  287.     test    al,cl
  288.     jnz @get32_16
  289.  
  290.         pop     edi
  291.         pop     esi
  292.         pop     ds
  293.     leave
  294.     ret
  295. _getstr32_16 endp
  296.  
  297.     ;
  298.     ; void cpy32_32(WORD s_ds,DWORD s_off,WORD d_ds,DWORD d_off,DWORD size)
  299.     ;
  300. public _cpy32_32
  301. _cpy32_32 proc near
  302.     ; stack: 4 = source_ds32, 6 = DWORD source_off32
  303.     ;    10 = ds32, 12= DWORD off32, 16= DWORD bytes
  304.     push    bp
  305.     mov    bp,sp
  306.     push    ds
  307.         push    es
  308.         push    esi
  309.         push    edi
  310.     mov    ax,word ptr [bp+4]        ; get source dataseg
  311.     mov    ds,ax                ; source = DS:ESI
  312.         mov     esi,dword ptr [bp+6]            ; get source offset
  313.  
  314.     mov    ax,word ptr [bp+10]        ; get dest dataseg
  315.     mov    es,ax                ; dest = ES:EDI
  316.     mov    edi,dword ptr [bp+12]        ; get dest offset
  317.  
  318.     mov    ecx,dword ptr [bp+16]        ; get size
  319.         cld
  320.  
  321.     push    ecx
  322.     shr    ecx,dword ptr 00000002H
  323.     jecxz    @byte_cpy32_32
  324.         rep
  325.     db 067h                 ; use edi,esi
  326.     movsd
  327.  
  328. @byte_cpy32_32:
  329.     pop    ecx
  330.     and    ecx,dword ptr 00000003H
  331.     jecxz    @end_cpy32_32
  332.     rep
  333.     db 067h                 ; use edi,esi
  334.     movsb
  335.  
  336. @end_cpy32_32:
  337.     pop    edi
  338.         pop     esi
  339.         pop     es
  340.     pop    ds
  341.     leave
  342.     ret
  343. _cpy32_32 endp
  344.  
  345.  
  346. _TEXT ends
  347.  
  348.       end
  349.