home *** CD-ROM | disk | FTP | other *** search
/ Der Mediaplex Sampler - Die 6 von Plex / 6_v_plex.zip / 6_v_plex / DISK5 / DOS_42 / XLIB30.ZIP / EASYX.ASM next >
Assembly Source File  |  1993-12-18  |  9KB  |  225 lines

  1. ;This file contains the MASM source code for EASYX.LIB.  This code was 
  2. ;assembled and then linked with XLIB.LIB to obtain EASYX.LIB.  The source 
  3. ;code is included in the XLIB archive primarily as a demonstration of the 
  4. ;usage of XLIB.
  5.  
  6.                .MODEL         LARGE,PASCAL
  7.                .386P
  8.  
  9.                INCLUDE        XLIB.INC
  10.  
  11. CSEG           SEGMENT PARA PUBLIC USE16 'CODE'
  12.                ASSUME CS:CSEG
  13.  
  14. ;Allocate extended memory block.  Error code returned in DX:AX.
  15. XMALLOC        PROC FAR,
  16.                NOBYTES:DWORD,                ;Number of bytes to allocate
  17.                ADRPTR:DWORD,                 ;Far pointer to linear address of allocated block
  18.                SIZEPTR:DWORD,                ;Far pointer to size of allocated block
  19.                HANDLEPTR:DWORD               ;Far pointer to handle of allocated block
  20.                PUSH           EBX
  21.                PUSH           ECX
  22.                PUSH           DS
  23.                MOV            EAX,NOBYTES
  24.                CALL           GETMEM
  25.                OR             EAX,EAX
  26.                JNZ            SHORT EXIT
  27.                PUSH           EBX
  28.                LDS            BX,ADRPTR
  29.                MOV            [BX],EDX
  30.                LDS            BX,SIZEPTR
  31.                MOV            [BX],ECX
  32.                LDS            BX,HANDLEPTR
  33.                POP            DWORD PTR [BX]
  34. EXIT:          PUSH           EAX                           ;Return error code in DX:AX
  35.                POP            AX
  36.                POP            DX
  37.                POP            DS
  38.                POP            ECX
  39.                POP            EBX
  40.                RET
  41. XMALLOC        ENDP
  42.  
  43. ;Release extended memory block.  Error code returned in DX:AX.
  44. XFREE          PROC FAR,
  45.                HANDLE:DWORD                                 ;Handle to previously allocated block
  46.                MOV            EAX,HANDLE
  47.                CALL           FREEMEM
  48.                PUSH           EAX                           ;Put error code in DX:AX
  49.                POP            AX
  50.                POP            DX
  51.                RET
  52. XFREE          ENDP
  53.  
  54. ;Map physical memory to logical address space.  Error code returned in DX:AX.
  55. MAPIOMEM       PROC FAR,
  56.                PHYSADR:DWORD,                               ;Linear address of physical memory
  57.                BLKSIZE:DWORD,                               ;Size of memory block (in bytes)
  58.                LOGADRPTR:DWORD                              ;Far pointer to DWORD to receive logical address
  59.                PUSH           BX
  60.                PUSH           DS
  61.                MOV            EDX,PHYSADR
  62.                MOV            EAX,BLKSIZE
  63.                PUSHD          OFFSET PMMAPIO
  64.                CALL           CALLPM
  65.                LDS            BX,LOGADRPTR
  66.                MOV            [BX],EDX
  67.                PUSH           EAX                           ;Place error code in DX:AX
  68.                POP            AX
  69.                POP            DX
  70.                POP            DS
  71.                POP            BX
  72.                RET
  73. MAPIOMEM       ENDP
  74.  
  75.                ALIGN          16
  76. MOVMEM         PROC FAR,
  77.                DESTADR:DWORD,                               ;Destination address
  78.                SOURCEADR:DWORD,                             ;Source address
  79.                NOBYTES:DWORD                                ;Number of bytes to transfer
  80.                PUSH           ECX
  81.                PUSH           ESI
  82.                PUSH           EDI
  83.                MOV            ESI,SOURCEADR
  84.                MOV            EDI,DESTADR
  85.                MOV            ECX,NOBYTES
  86.                PUSHD          OFFSET MOVMEM32
  87.                CALL           CALLPM
  88.                POP            EDI
  89.                POP            ESI
  90.                POP            ECX
  91.                RET
  92. MOVMEM         ENDP
  93.  
  94. ;Calculate linear address from segment address.  Call with segment address on
  95. ;stack.  Linear address returned in EAX and in DX:AX.
  96. LINADR         PROC FAR
  97.                XOR            EAX,EAX
  98.                XOR            EDX,EDX
  99.                MOV            DX,[ESP+4]
  100.                MOV            AX,[ESP+6]
  101.                SHL            EAX,4
  102.                ADD            EAX,EDX
  103.                MOV            EDX,EAX
  104.                SHR            EDX,16
  105.                RET            4
  106. LINADR         ENDP
  107.  
  108. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  109. ;Interfaces to XLIB file management routines.  Each of these procedures should
  110. ;be called with the segment address of the control block on the stack.
  111. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  112.  
  113. ;Create file.
  114. XFCREATE       PROC FAR
  115.                PUSHD          OFFSET PMXCREATE
  116.                JMP            CHAINTOPM
  117. XFCREATE       ENDP
  118.  
  119. ;Open file.
  120. XFOPEN         PROC FAR
  121.                PUSHD          OFFSET PMXOPEN
  122.                JMP            CHAINTOPM
  123. XFOPEN         ENDP
  124.  
  125. ;Close file.
  126. XFCLOSE        PROC FAR
  127.                PUSHD          OFFSET PMXCLOSE
  128.                JMP            CHAINTOPM
  129. XFCLOSE        ENDP
  130.  
  131. ;Load file
  132. XFLOAD         PROC FAR
  133.                PUSHD          OFFSET PMXLOAD
  134.                JMP            CHAINTOPM
  135. XFLOAD         ENDP
  136.  
  137. ;Save file.
  138. XFSAVE         PROC FAR
  139.                PUSHD          OFFSET PMXSAVE
  140.                JMP            CHAINTOPM
  141. XFSAVE         ENDP
  142.  
  143. ;Random read file.
  144. XFREAD         PROC FAR
  145.                PUSHD          OFFSET PMXREAD
  146.                JMP            CHAINTOPM
  147. XFREAD         ENDP
  148.  
  149. ;Random write file.
  150. XFWRITE        PROC FAR
  151.                PUSHD          OFFSET PMXWRITE
  152.                JMP            CHAINTOPM
  153. XFWRITE        ENDP
  154.  
  155. ;Transfer control to protected mode after converting segment address of control
  156. ;block to linear address in EAX.
  157. CHAINTOPM      PROC FAR
  158.                PUSH           DWORD PTR [ESP+8]             ;PUSH segment address of control block
  159.                CALL           LINADR
  160.                CALL           CALLPM
  161.                RET            4
  162. CHAINTOPM      ENDP
  163.  
  164.                EXTERNDEF PASCAL XMALLOC:FAR
  165.                EXTERNDEF PASCAL XFREE:FAR
  166.                EXTERNDEF PASCAL MAPIOMEM:FAR
  167.                EXTERNDEF PASCAL LINADR:FAR
  168.                EXTERNDEF PASCAL MOVMEM:FAR
  169.                EXTERNDEF PASCAL XFCREATE:FAR
  170.                EXTERNDEF PASCAL XFOPEN:FAR
  171.                EXTERNDEF PASCAL XFCLOSE:FAR
  172.                EXTERNDEF PASCAL XFLOAD:FAR
  173.                EXTERNDEF PASCAL XFSAVE:FAR
  174.                EXTERNDEF PASCAL XFREAD:FAR
  175.                EXTERNDEF PASCAL XFWRITE:FAR
  176.  
  177. CSEG           ENDS
  178.  
  179. TSEG           SEGMENT PARA PUBLIC USE32 'CODE'
  180.                ASSUME CS:TSEG
  181.  
  182. ;Transfer memory.  Call with source address in ESI, destination address in EDI,
  183. ;and number of bytes to transfer in ECX.  Does not preserve registers.
  184.                ALIGN          16
  185. MOVMEM32       PROC NEAR
  186.                CMP            EDI,ESI
  187.                JBE            ENTERDN4
  188.                JMP            ENTERUP4
  189.                ALIGN          4
  190. UP4LOOP:       MOV            EAX,[ESI+1*ECX]               ;Destination address is higher than source address
  191.                MOV            [EDI+1*ECX],EAX
  192. ENTERUP4:      SUB            ECX,4
  193.                JAE            UP4LOOP
  194.                ADD            ECX,4
  195.                JNZ            ENTERUP1
  196.                RET
  197.                ALIGN          4
  198. UP1LOOP:       MOV            AL,[ESI+1*ECX]
  199.                MOV            [EDI+1*ECX],AL
  200. ENTERUP1:      DEC            ECX
  201.                JNS            UP1LOOP
  202.                RET
  203.                ALIGN          4
  204. DN4LOOP:       MOV            EAX,[ESI]                     ;Destination address is lower than source address
  205.                MOV            [EDI],EAX
  206.                ADD            ESI,4
  207.                ADD            EDI,4
  208. ENTERDN4:      SUB            ECX,4
  209.                JAE            DN4LOOP
  210.                ADD            ECX,4
  211.                JNZ            ENTERDN1
  212.                RET
  213.                ALIGN          4
  214. DN1LOOP:       MOV            AL,[ESI]
  215.                MOV            [EDI],AL
  216.                INC            ESI
  217.                INC            EDI
  218. ENTERDN1:      DEC            ECX
  219.                JNS            DN1LOOP
  220.                RET
  221. MOVMEM32       ENDP
  222.  
  223. TSEG           ENDS
  224.                END
  225.