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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [newlib-1.10.0/] [newlib/] [libc/] [sys/] [go32/] [screen.S] - Rev 1773

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

/* This is file SCREEN.S */
/*
** Copyright (C) 1993 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained.  This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**
** Modified by J. Alan Eldridge, Liberty Brokerage, 77 Water St, NYC 10005
**
** added global char ScreenAttrib -- this is the attribute
** used by ScreenClear(): it defaults to 0x07 so as not to
** break existing code.
**
** Modified by C. Sandmann (sandmann@clio.rice.edu) for DPMI support
** Combined SCREEN2.S and SCREEN.C into SCREEN.S
*/

        .data

        .globl  _ScreenAttrib
_ScreenAttrib:
        .byte 0x07

        .text

        .align 2
        .globl  _ScreenSetCursor
                /* row, col */
_ScreenSetCursor:
        pushl   %ebp
        movl    %esp,%ebp
        pushl   %ebx
        pushl   %esi
        pushl   %edi
        movb    $0x02,%ah
        movb    $0,%bh
        movb    8(%ebp),%dh
        movb    12(%ebp),%dl
        int     $0x10
        popl    %edi
        popl    %esi
        popl    %ebx
        popl    %ebp
        ret

        .align 2
        .globl  _ScreenGetCursor
                 /* &row, &col */
_ScreenGetCursor:
        pushl   %ebp
        movl    %esp,%ebp
        pushl   %ebx
        pushl   %esi
        pushl   %edi
        movb    $0x03,%ah
        movb    $0,%bh
        pushl   %ebp
        int     $0x10
        popl    %ebp
        movl    8(%ebp),%esi
        movzbl  %dh,%eax
        movl    %eax,(%esi)
        movl    12(%ebp),%esi
        movzbl  %dl,%eax
        movl    %eax,(%esi)
        popl    %edi
        popl    %esi
        popl    %ebx
        popl    %ebp
        ret

        .align 2
        .globl  _ScreenClear
_ScreenClear:
        pushl   %edi
        call    _ScreenCols
        movl    %eax,%ecx
        call    _ScreenRows
                /* ECX is total words to store */
        imull   %eax,%ecx
        movl    _ScreenPrimary,%eax
        call    dosmemsetup
        movl    %eax,%edi
        push    %es
        push    %gs
        pop     %es
        movb    $0x20,%al
        movb    _ScreenAttrib,%ah
        rep
        stosw
        pop     %es
        popl    %edi
        ret
        
        .align 2
        .globl _ScreenRows
_ScreenRows:
        movl    $0x484,%eax
        call    dosmemsetup
        movzbl  %gs:(%eax),%eax
        incl    %eax
        ret

        .align 2
        .globl _ScreenCols
_ScreenCols:
        movl    $0x44a,%eax
        call    dosmemsetup
        movzwl  %gs:(%eax),%eax
        ret

        .align 2
        .globl _ScreenMode
_ScreenMode:
        movl    $0x449,%eax
        call    dosmemsetup
        movzbl  %gs:(%eax),%eax
        ret

        .align 2
        .globl _ScreenPutChar
_ScreenPutChar:
                /* int ch, int attr, unsigned x, unsigned y */
/*
  if ( (x >= ScreenCols()) || (y >= ScreenRows())) return;
  ch &= 0xff;
  attr = (attr & 0xff) << 8;
  *(unsigned short *)(ScreenPrimary+x+y*ScreenCols()) = ch | attr;
*/
        call    _ScreenRows
        cmpl    %eax,16(%esp)
        jae     L1
        call    _ScreenCols
        cmpl    %eax,12(%esp)
        jae     L1
                                /* Out of range */
        movl    %eax,%edx
        imull   16(%esp),%edx
        addl    12(%esp),%edx
                        /* EDX = x + y*ScreenCols */

        movb    4(%esp),%cl
        movb    8(%esp),%ch

        movl    _ScreenPrimary,%eax
        call    dosmemsetup
        movw    %cx,%gs:(%eax,%edx,2)   
L1:
        ret     

/* A quick way to update the screen from a logical video buffer, used 
   primarily for DPMI full screen management */
        .align 2
        .globl _ScreenUpdate
                /* (void *)screenbuf */
_ScreenUpdate:
        call    _ScreenRows
        movl    %eax,%ecx
        call    _ScreenCols
        imull   %eax,%ecx
        sarl    $1,%ecx
                        /* Number of long words in screen */

        movl    _ScreenPrimary,%eax
        call    dosmemsetup
        movl    4(%esp),%edx
                /* screenbuf */

        pushl   %esi
        pushl   %edi
        movl    %eax,%edi
        movl    %edx,%esi
        push    %es
        push    %gs
        pop     %es
        rep
        movsl
                                        /* move ECX bytes to Real area */
        pop     %es
        popl    %edi
        popl    %esi
        ret

/* A quick way to update a screen line from a logical video buffer, used 
   primarily for DPMI full screen management */
        .align 2
        .globl _ScreenUpdateLine
                /* (void *)screenline, int row */
_ScreenUpdateLine:
        call    _ScreenCols
        movl    %eax,%ecx
        sarl    $1,%ecx
                        /* Number of long words in screen line */
        shll    $1,%eax
        imull   8(%esp),%eax
        addl    _ScreenPrimary,%eax
        call    dosmemsetup
        movl    4(%esp),%edx
                /* screenbuf */

        pushl   %esi
        pushl   %edi
        movl    %eax,%edi
        movl    %edx,%esi
        push    %es
        push    %gs
        pop     %es
        rep
        movsl
                                        /* move ECX bytes to Real area */
        pop     %es
        popl    %edi
        popl    %esi
        ret


/* A quick way to update the screen from a logical video buffer, used 
   primarily for DPMI full screen management */
        .align 2
        .globl _ScreenRetrieve
                /* (void *)screenbuf */
_ScreenRetrieve:
        call    _ScreenRows
        movl    %eax,%ecx
        call    _ScreenCols
        imull   %eax,%ecx
        sarl    $1,%ecx
                        /* Number of long words in screen */

        movl    _ScreenPrimary,%eax
        call    dosmemsetup
        movl    4(%esp),%edx
                /* screenbuf */

        pushl   %esi
        pushl   %edi
        movl    %eax,%esi
        movl    %edx,%edi
        push    %ds
        push    %gs
        pop     %ds
        rep
        movsl
                                        /* move ECX bytes to Real area */
        pop     %ds
        popl    %edi
        popl    %esi
        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.