📄 screen.s
字号:
/* 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -