⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pmgraph.asm

📁 XOSL 多操作系统管理工具 源代码 多系统引导工具
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;
; Extended Operating System Loader (XOSL)
; Copyright (c) 1999 by Geurt Vos
;
; This code is distributed under GNU General Public License (GPL)
;
; The full text of the license can be found in the GPL.TXT file,
; or at http://www.gnu.org
;

;**
; * File: PMGRAPH.ASM
; * Author: Geurt Vos
; * Date: Nov 3, 1998
; * 
; * Takes care of the triple buffering in protected mode
; * 
; * reg |  size  | base (ph) |   limit  | Description
; * ---------------------------------------------------------------
; *  CS | 16-bit |    CODE   | 0000ffff | Real mode code segment  |
; *  DS | 16-bit |    DATA   | 0000ffff | Real mode data segment  |
; *  SS | 16-bit |   STACK   | 0000ffff | Real mode stack segment |
; *  ES | 32-bit | 0012:0000 | 001d5000 | First graphics buffer   |
; *  FS | 16-bit | 000a:0000 | 0000ffff | Graphics framebuffer    |
; *  GS | 32-bit | 0000:0000 | 000fffff | All addressable memory  |
; * 


		.model  compact
		.386p
                .data?
                public  _PhysFontHeader, _PhysFontData, _DataSize

_PhysFontHeader dd      ?
_PhysFontData   dd      ?
_DataSize       dw      ?

PtrX            dd      ?
PtrY            dd      ?
PtrL            dd      ?

AbsX            dd      ?
AbsY            dd      ?

ScreenBuffer    equ     00120000h       ;1875k
BGndBuffer      equ     002f4c00h       ;1875k
FontDataX       equ     00100200h       ;24k
FontDataY       equ     00106200h       ;24k
FontDataL       equ     0010c200h       ;24k
GrTextBuffer    equ     00112200h       ;20k
;ScreenBuffer    equ     00100000h       ;1875k
;BGndBuffer      equ     002d4c00h       ;1875k
;FontDataX       equ     00380200h       ;24k
;FontDataY       equ     00386200h       ;24k
;FontDataL       equ     0038c200h       ;24k
;GrTextBuffer    equ     00392200h       ;20k

		.data
TGraphQueue     struc
	PhysParams      dd      0
	Func            dd      0
TGraphQueue     ends


extrn           _GRWidth: dword
extrn           _GRHeight: dword
extrn           _GRThisBank: word

extrn           _GraphAction: near

extrn           _VPLeft: dword
extrn           _VPTop: dword
extrn           _ClipLeft: dword
extrn           _ClipTop: dword
extrn           _ClipWidth: dword
extrn           _ClipHeight: dword
extrn           _ClipRight: dword
extrn           _ClipBottom: dword

extrn           _AddrLinearFB: dword

                assume  cs:FARCODE

FARCODE         segment word public use16 'CODE'


                extrn   _BankSwitch: near
		extrn   SwitchPM: near
		extrn   SwitchRM: near


;void DoPMGraphics()
		public  _DoPMGraphics
_DoPMGraphics   proc    far
		push    esi
		call    SwitchPM
                mov     esi,seg _GraphAction
		shl     esi,4
                mov     eax,offset _GraphAction
		add     esi,eax

		mov     ebx,gs:[esi].PhysParams
		push    gs:dword ptr [ebx]
		push    gs:dword ptr [ebx + 4]
		push    gs:dword ptr [ebx + 8]
		push    gs:dword ptr [ebx + 12]
		push    gs:dword ptr [ebx + 16]
		call    gs:word ptr [esi].Func
		add     sp,20

		call    SwitchRM
		pop     esi
                retf
_DoPMGraphics   endp

PMBankSwitch    proc
                pushad
                push    es fs
		call    SwitchRM
		xor     bx,bx
                call    _BankSwitch
		call    SwitchPM
                pop     fs es
                popad
		ret
PMBankSwitch    endp


;void FlushArea(long Left, long Top, long Width, long Heigth)
		public  _FlushArea
_FlushArea      proc
		enter   4,0
		push    esi
		push    edi

		push    es              ;swap es and fs
		push    fs
		pop     es
		pop     fs

		cld
                mov     eax,[bp + 8]
                imul    eax,_GRWidth
                add     eax,[bp + 4]
                mov     esi,eax
		shld    edx,eax,16
		movzx   edi,ax

		cmp     _GRThisBank,dx
		je      FADoFlush
		push    eax
		call    PMBankSwitch
		pop     eax

FADoFlush:      mov     eax,_GRWidth
		mov     ecx,[bp + 12]
		sub     eax,ecx
		mov     [bp - 4],eax

FALoop:         push    cx
		mov     ax,di
		add     ax,cx
		jnc     FADraw
		push    ax
		sub     cx,ax

		rep     movs es:byte ptr [edi],fs:byte ptr [esi]

		xor     edi,edi
		pop     cx
		inc     dx
		call    PMBankSwitch
						  
FADraw:
		rep     movs es:byte ptr [edi],fs:byte ptr [esi]
		pop     cx

		add     esi,[bp - 4]
		add     di,[bp - 4]
		jnc     FATestEnd
		inc     dx
		call    PMBankSwitch

FATestEnd:      sub     word ptr [bp + 16],1
                jnz     FALoop
		mov     _GRThisBank,dx

		push    es              ;swap es and fs
		push    fs
		pop     es
		pop     fs

		pop     edi
		pop     esi
		leave
		ret
_FlushArea      endp

;void FlushAreaVBE2(long Left, long Top, long Width, long Height)
                public  _FlushAreaVBE2
_FlushAreaVBE2  proc
                push    bp
                mov     bp,sp
                push    esi
                push    edi
                push    es
                push    gs
                pop     es
                pop     gs

                cld
                mov     esi,[bp + 8]
                imul    esi,_GRWidth
                add     esi,[bp + 4]
                mov     edi,esi

                add     edi,_AddrLinearFB
                mov     eax,_GRWidth
                sub     eax,[bp + 12]
                jmp     FA2TestEnd

FA2DrawLoop:    mov     ecx,[bp + 12]
                shr     ecx,2
                rep     movs es:dword ptr [edi],gs:[esi]
                mov     ecx,[bp + 12]
                and     ecx,3
                jz      FA2RowDone
                rep     movs es:byte ptr [edi],gs:[esi]

FA2RowDone:     add     edi,eax
                add     esi,eax

FA2TestEnd:     dec     word ptr [bp + 16]
                jns     FA2DrawLoop


                push    es
                push    gs
                pop     es
                pop     gs
                pop     edi
                pop     esi
                pop     bp
                ret
_FlushAreaVBE2  endp

;void UltraFlush()
		public  _UltraFlush
_UltraFlush     proc
		push    esi
		push    edi
		push    es
		push    fs
		pop     es
		pop     fs
		cld

		mov     eax,_GRWidth
                imul    eax,_GRHeight
		push    ax              ;byte count last bank
		shr     eax,16

		xor     esi,esi
		mov     ecx,16384
		xor     dx,dx
		cmp     _GRThisBank,dx
		je      UFTestEnd
		call    PMBankSwitch
		jmp     UFTestEnd

UFDoFlush:      xor     edi,edi
		push    cx
		rep     movs es:dword ptr [edi],fs:[esi]
		pop     cx
		inc     dx
		call    PMBankSwitch

UFTestEnd:      dec     ax
		jns     UFDoFlush
		pop     cx
		shr     cx,2
		xor     edi,edi
		rep     movs es:dword ptr [edi],fs:[edi]
		mov     _GRThisBank,dx
		push    es
		push    fs
		pop     es
		pop     fs
		pop     edi
		pop     esi
		ret
_UltraFlush     endp

;void UltraFlushVBE2()
                public  _UltraFlushVBE2
_UltraFlushVBE2 proc
                push    bp
                mov     bp,sp
                push    esi
                push    edi
                push    es
                push    gs
                pop     es
                pop     gs
                cld
                xor     esi,esi
                mov     edi,_AddrLinearFB
                mov     ecx,_GRWidth
                imul    ecx,_GRHeight
                shr     ecx,2
                rep     movs es:dword ptr [edi],gs:[esi]
                push    es
                push    gs
                pop     es
                pop     gs
                pop     edi
                pop     esi
                pop     bp
                ret
_UltraFlushVBE2 endp


;void PMStoreBuffer(long Left, long Top, long With, long Height);
		public  _StoreBuffer
_StoreBuffer    proc
		push    bp
		mov     bp,sp
		push    esi
		push    edi


                mov     esi,ScreenBuffer
                mov     edi,BGndBuffer
		call    Buffer2Buffer

		pop     edi
		pop     esi
		pop     bp
		ret
_StoreBuffer    endp

;void PMRestoreBuffer(long Left, long Top, long Width, long Height);
		public  _RestoreBuffer
_RestoreBuffer  proc
		push    bp
		mov     bp,sp
		push    esi
		push    edi

                mov     esi,BGndBuffer
                mov     edi,ScreenBuffer
		call    Buffer2Buffer

		pop     edi
		pop     esi
		pop     bp
		ret
_RestoreBuffer  endp


Buffer2Buffer   proc
		push    es
		push    gs
		pop     es
		cld

                mov     eax,[bp +  8]
                imul    eax,_GRWidth
                add     eax,[bp + 4]
                add     esi,eax
                add     edi,eax

		mov     ecx,[bp + 12]
		mov     eax,_GRWidth
		sub     eax,ecx
		jmp     SBTestEnd

SBLoop:         push    ecx
		shr     ecx,1
		rep     movs es:word ptr [edi],gs:[esi]
		jnc     SBEven
		movs    es:byte ptr [edi],gs:[esi]
SBEven:         pop     ecx
		add     edi,eax
		add     esi,eax
SBTestEnd:      dec     word ptr [bp + 16]
		jns     SBLoop

		pop     es
		ret
Buffer2Buffer   endp
;-------------------------------------------------------------
;void PutPixel(long Left, long Top, long Color)
		public  _PutPixel
_PutPixel       proc
		push    bp
		mov     bp,sp

                mov     ebx,[bp + 8]
                imul    ebx,_GRWidth
                add     ebx,[bp + 4]
		mov     al,[bp + 12]
		mov     es:[ebx],al
		pop     bp

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -