OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [newlib/] [newlib/] [libc/] [sys/] [go32/] [dosmem.S] - Rev 39

Go to most recent revision | Compare with Previous | Blame | View Log

/* 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

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.