acadia-newlib/newlib/libc/sys/go32/screen.S

257 lines
4.5 KiB
ArmAsm

/* This is file SCREEN.S */
/*
** Copyright (C) 1993 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
**
** This file is distributed under the terms listed in the document
** "copying.dj", available from DJ Delorie at the address above.
** 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