257 lines
4.4 KiB
ArmAsm
257 lines
4.4 KiB
ArmAsm
/* 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
|
|
|
|
|