summaryrefslogtreecommitdiff
path: root/newlib/libc/sys/go32/screen.S
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/sys/go32/screen.S')
-rw-r--r--newlib/libc/sys/go32/screen.S256
1 files changed, 256 insertions, 0 deletions
diff --git a/newlib/libc/sys/go32/screen.S b/newlib/libc/sys/go32/screen.S
new file mode 100644
index 00000000000..4786f7ffe81
--- /dev/null
+++ b/newlib/libc/sys/go32/screen.S
@@ -0,0 +1,256 @@
+/* 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
+
+