home *** CD-ROM | disk | FTP | other *** search
- /* DOSMEM.S */
- /*
- ** Copyright (C) 1993 C.W. Sandmann
- **
- ** This file may be freely distributed as long as the author's name remains.
- ** Extender environment independent way to set up Real area 1Mb access.
- ** Procedure takes a single argument %eax which contains the real area offset.
- ** After call, access may be made with "%gs:(%eax)"
- */
- .text
- .align 2
- .globl dosmemsetup
- dosmemsetup: /* no params, expected ASM call only */
- pushl %eax
- movzwl __core_select,%eax
- testl %eax,%eax
- je old_go32 /* Image run with pre-DPMI extender */
- movw %ax,%gs /* Use real area selector */
- popl %eax /* Plus real offset */
- andl $0x0fffffff,%eax /* Clear any linear access bits */
- ret
- .align 2,0x90
- old_go32:
- push %ds
- pop %gs /* Use arena selector */
- popl %eax
- orl $0xe0000000,%eax /* Plus linear access area */
- ret
-
- .align 2
- .globl _dosmemget
- _dosmemget: /* long offset, long len, long *buf */
- push %gs
- movl 8(%esp),%eax /* offset */
- call dosmemsetup
- movl 12(%esp),%ecx /* length */
- movl 16(%esp),%edx /* arena offset */
- pushl %esi
- pushl %edi
- movl %eax,%esi
- movl %edx,%edi
- push %ds
- push %es
- push %ds
- pop %es
- push %gs
- pop %ds
- cld
- rep
- movsb /* move ECX bytes from Real area */
- pop %es
- pop %ds
- popl %edi
- popl %esi
- pop %gs
- ret
-
- .align 2
- .globl _dosmemput
- _dosmemput: /* long *buf, long len, long offset */
- push %gs
- movl 16(%esp),%eax /* offset */
- call dosmemsetup
- movl 12(%esp),%ecx /* length */
- movl 8(%esp),%edx /* arena offset */
- pushl %esi
- pushl %edi
- movl %eax,%edi
- movl %edx,%esi
- push %es
- push %gs
- pop %es
- cld
- rep
- movsb /* move ECX bytes to Real area */
- pop %es
- popl %edi
- popl %esi
- pop %gs
- ret
-
- .align 2 /* 8(bp) 12(bp) 16(bp) 20(bp) 24(bp) */
- .globl _movedata /* src_sel, src_ofs, dest_sel, dest_ofs, len */
- _movedata:
- pushl %ebp
- movl %esp,%ebp
- pushw %ds
- pushw %es
- pushl %esi
- pushl %edi
-
- movl 8(%ebp),%eax
- movw %ax,%ds
- movl 12(%ebp),%esi
-
- movl 16(%ebp),%eax
- movw %ax,%es
- movl 20(%ebp),%edi
-
- movl 24(%ebp),%ecx
- pushl %ecx
- shrl $2,%ecx
- jcxz no_big_move
- rep
- movsl
- no_big_move:
- popl %ecx
- andl $3,%ecx
- jcxz no_little_move
- rep
- movsb
- no_little_move:
-
- popl %edi
- popl %esi
- popw %es
- popw %ds
- leave
- ret
-