📄 pmgraph.asm
字号:
;
; 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 + -