1328 lines
15 KiB
NASM
1328 lines
15 KiB
NASM
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[extern _AllocMem]
|
|
[extern _AllocSelector]
|
|
[extern _FreeSelector]
|
|
[extern _GetPhysicalMapping]
|
|
[extern _FreePhysicalMapping]
|
|
[extern _LockArea]
|
|
|
|
_AllocMem_arglen equ 4
|
|
_AllocSelector_arglen equ 4
|
|
_FreeSelector_arglen equ 2
|
|
_GetPhysicalMapping_arglen equ 16
|
|
_FreePhysicalMapping_arglen equ 8
|
|
_LockArea_arglen equ 10
|
|
|
|
|
|
|
|
|
|
|
|
[extern _OpenFile]
|
|
[extern _CloseFile]
|
|
[extern _ReadFile]
|
|
[extern _ReadFile_Sel]
|
|
[extern _WriteFile]
|
|
[extern _WriteFile_Sel]
|
|
[extern _SeekFile]
|
|
|
|
_OpenFile_arglen equ 6
|
|
_CloseFile_arglen equ 4
|
|
_ReadFile_arglen equ 12
|
|
_ReadFile_Sel_arglen equ 14
|
|
_WriteFile_arglen equ 12
|
|
_WriteFile_Sel_arglen equ 14
|
|
_SeekFile_arglen equ 10
|
|
|
|
[bits 32]
|
|
|
|
|
|
[extern ___sbrk]
|
|
[extern _getenv]
|
|
|
|
___sbrk_arglen equ 4
|
|
_getenv_arglen equ 4
|
|
|
|
|
|
[extern _djgpp_es]
|
|
[extern _djgpp_fs]
|
|
[extern _djgpp_gs]
|
|
|
|
|
|
[extern ___dos_argv0]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
afHaveMultiBuffer equ 0001h
|
|
afHaveVirtualScroll equ 0002h
|
|
afHaveBankedBuffer equ 0004h
|
|
afHaveLinearBuffer equ 0008h
|
|
afHaveAccel2D equ 0010h
|
|
afHaveDualBuffers equ 0020h
|
|
afHaveHWCursor equ 0040h
|
|
afHave8BitDAC equ 0080h
|
|
afNonVGAMode equ 0100h
|
|
afHaveDoubleScan equ 0200h
|
|
afHaveInterlaced equ 0400h
|
|
afHaveTripleBuffer equ 0800h
|
|
afHaveStereo equ 1000h
|
|
afHaveROP2 equ 2000h
|
|
afHaveHWStereoSync equ 4000h
|
|
afHaveEVCStereoSync equ 8000h
|
|
|
|
|
|
[absolute 0]
|
|
AF_MODE_INFO:
|
|
.Attributes resw 1
|
|
.XResolution resw 1
|
|
.YResolution resw 1
|
|
.BytesPerScanLine resw 1
|
|
.BitsPerPixel resw 1
|
|
.MaxBuffers resw 1
|
|
.RedMaskSize resb 1
|
|
.RedFieldPosition resb 1
|
|
.GreenMaskSize resb 1
|
|
.GreenFieldPosition resb 1
|
|
.BlueMaskSize resb 1
|
|
.BlueFieldPosition resb 1
|
|
.RsvdMaskSize resb 1
|
|
.RsvdFieldPosition resb 1
|
|
.MaxBytesPerScanLine resw 1
|
|
.MaxScanLineWidth resw 1
|
|
|
|
.LinBytesPerScanLine resw 1
|
|
.BnkMaxBuffers resb 1
|
|
.LinMaxBuffers resb 1
|
|
.LinRedMaskSize resb 1
|
|
.LinRedFieldPosition resb 1
|
|
.LinGreenMaskSize resb 1
|
|
.LinGreenFieldPosition resb 1
|
|
.LinBlueMaskSize resb 1
|
|
.LinBlueFieldPosition resb 1
|
|
.LinRsvdMaskSize resb 1
|
|
.LinRsvdFieldPosition resb 1
|
|
.MaxPixelClock resd 1
|
|
.VideoCapabilities resd 1
|
|
.VideoMinXScale resw 1
|
|
.VideoMinYScale resw 1
|
|
.VideoMaxXScale resw 1
|
|
.VideoMaxYScale resw 1
|
|
.Reserved resb 76
|
|
AF_MODE_INFO_size:
|
|
[section .text]
|
|
|
|
|
|
[absolute 0]
|
|
AF_DRIVER:
|
|
|
|
.Signature resb 12
|
|
.Version resd 1
|
|
.DriverRev resd 1
|
|
.OemVendorName resb 80
|
|
.OemCopyright resb 80
|
|
.AvailableModes resd 1
|
|
.TotalMemory resd 1
|
|
.Attributes resd 1
|
|
.BankSize resd 1
|
|
.BankedBasePtr resd 1
|
|
.LinearSize resd 1
|
|
.LinearBasePtr resd 1
|
|
.LinearGranularity resd 1
|
|
.IOPortsTable resd 1
|
|
.IOMemoryBase resd 4
|
|
.IOMemoryLen resd 4
|
|
.LinearStridePad resd 1
|
|
.PCIVendorID resw 1
|
|
.PCIDeviceID resw 1
|
|
.PCISubSysVendorID resw 1
|
|
.PCISubSysID resw 1
|
|
.Checksum resd 1
|
|
.res2 resd 6
|
|
|
|
.IOMemMaps resd 4
|
|
.BankedMem resd 1
|
|
.LinearMem resd 1
|
|
.res3 resd 5
|
|
|
|
.BufferEndX resd 1
|
|
.BufferEndY resd 1
|
|
.OriginOffset resd 1
|
|
.OffscreenOffset resd 1
|
|
.OffscreenStartY resd 1
|
|
.OffscreenEndY resd 1
|
|
.res4 resd 10
|
|
|
|
.SetBank32Len resd 1
|
|
.SetBank32 resd 1
|
|
|
|
.Int86 resd 1
|
|
.CallRealMode resd 1
|
|
|
|
.InitDriver resd 1
|
|
|
|
.af10Funcs resd 40
|
|
|
|
.PlugAndPlayInit resd 1
|
|
|
|
.OemExt resd 1
|
|
|
|
.SupplementalExt resd 1
|
|
|
|
.GetVideoModeInfo resd 1
|
|
.SetVideoMode resd 1
|
|
.RestoreTextMode resd 1
|
|
.GetClosestPixelClock resd 1
|
|
.SaveRestoreState resd 1
|
|
.SetDisplayStart resd 1
|
|
.SetActiveBuffer resd 1
|
|
.SetVisibleBuffer resd 1
|
|
.GetDisplayStartStatus resd 1
|
|
.EnableStereoMode resd 1
|
|
.SetPaletteData resd 1
|
|
.SetGammaCorrectData resd 1
|
|
.SetBank resd 1
|
|
|
|
.SetCursor resd 1
|
|
.SetCursorPos resd 1
|
|
.SetCursorColor resd 1
|
|
.ShowCursor resd 1
|
|
|
|
.WaitTillIdle resd 1
|
|
.EnableDirectAccess resd 1
|
|
.DisableDirectAccess resd 1
|
|
.SetMix resd 1
|
|
.Set8x8MonoPattern resd 1
|
|
.Set8x8ColorPattern resd 1
|
|
.Use8x8ColorPattern resd 1
|
|
.SetLineStipple resd 1
|
|
.SetLineStippleCount resd 1
|
|
.SetClipRect resd 1
|
|
.DrawScan resd 1
|
|
.DrawPattScan resd 1
|
|
.DrawColorPattScan resd 1
|
|
.DrawScanList resd 1
|
|
.DrawPattScanList resd 1
|
|
.DrawColorPattScanList resd 1
|
|
.DrawRect resd 1
|
|
.DrawPattRect resd 1
|
|
.DrawColorPattRect resd 1
|
|
.DrawLine resd 1
|
|
.DrawStippleLine resd 1
|
|
.DrawTrap resd 1
|
|
.DrawTri resd 1
|
|
.DrawQuad resd 1
|
|
.PutMonoImage resd 1
|
|
.PutMonoImageLin resd 1
|
|
.PutMonoImageBM resd 1
|
|
.BitBlt resd 1
|
|
.BitBltSys resd 1
|
|
.BitBltLin resd 1
|
|
.BitBltBM resd 1
|
|
.SrcTransBlt resd 1
|
|
.SrcTransBltSys resd 1
|
|
.SrcTransBltLin resd 1
|
|
.SrcTransBltBM resd 1
|
|
.DstTransBlt resd 1
|
|
.DstTransBltSys resd 1
|
|
.DstTransBltLin resd 1
|
|
.DstTransBltBM resd 1
|
|
.StretchBlt resd 1
|
|
.StretchBltSys resd 1
|
|
.StretchBltLin resd 1
|
|
.StretchBltBM resd 1
|
|
.SrcTransStretchBlt resd 1
|
|
.SrcTransStretchBltSys resd 1
|
|
.SrcTransStretchBltLin resd 1
|
|
.SrcTransStretchBltBM resd 1
|
|
.DstTransStretchBlt resd 1
|
|
.DstTransStretchBltSys resd 1
|
|
.DstTransStretchBltLin resd 1
|
|
.DstTransStretchBltBM resd 1
|
|
|
|
.SetVideoInput resd 1
|
|
.SetVideoOutput resd 1
|
|
.StartVideoFrame resd 1
|
|
.EndVideoFrame resd 1
|
|
AF_DRIVER_size:
|
|
[section .text]
|
|
|
|
|
|
[absolute 0]
|
|
FAF_KEYBOARD_DATA:
|
|
.INT resb 1
|
|
.IRQ resb 1
|
|
.Port resw 1
|
|
FAF_KEYBOARD_DATA_size:
|
|
[section .text]
|
|
|
|
[section .bss]
|
|
|
|
DriverOffset resd 1
|
|
DriverSize resd 1
|
|
InGraphicsMode resb 1
|
|
ModeInfo resb AF_MODE_INFO_size
|
|
Filename resb 256
|
|
FreeBEExt resb 1
|
|
|
|
[section .data]
|
|
|
|
rcsid db '$Id: vbeaf.asm,v 1.1 2001/11/21 08:41:53 peter Exp $',0
|
|
|
|
VBEAFName db 'VBEAF.DRV', 0
|
|
VBEAFEnv db 'VBEAF_PATH', 0
|
|
|
|
[section .text]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_LoadGraphicsDriver_arglen equ 4
|
|
[global _LoadGraphicsDriver]
|
|
_LoadGraphicsDriver: push ebp
|
|
mov ebp, esp
|
|
|
|
|
|
.Filename equ 8
|
|
|
|
|
|
|
|
.file equ -4
|
|
.STACK_FRAME_SIZE equ 4
|
|
|
|
sub esp, .STACK_FRAME_SIZE
|
|
push es
|
|
push fs
|
|
push gs
|
|
mov gs, [_djgpp_gs]
|
|
mov fs, [_djgpp_fs]
|
|
mov es, [_djgpp_es]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
push word 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
push dword [ebp+.Filename]
|
|
|
|
call _OpenFile
|
|
add esp, byte _OpenFile_arglen
|
|
cmp eax, -1
|
|
je near .error
|
|
mov [ebp+.file], eax
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
push word 2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
push dword 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
push dword [ebp+.file]
|
|
|
|
call _SeekFile
|
|
add esp, byte _SeekFile_arglen
|
|
cmp eax, -1
|
|
je near .error
|
|
mov [DriverSize], eax
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
push word 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
push dword 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
push dword [ebp+.file]
|
|
|
|
call _SeekFile
|
|
add esp, byte _SeekFile_arglen
|
|
cmp eax, -1
|
|
je .error
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
push dword [DriverSize]
|
|
|
|
call ___sbrk
|
|
add esp, byte ___sbrk_arglen
|
|
test eax, eax
|
|
jz .error
|
|
mov [DriverOffset], eax
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
push dword [DriverSize]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
push dword [DriverOffset]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
push dword [ebp+.file]
|
|
|
|
call _ReadFile
|
|
add esp, byte _ReadFile_arglen
|
|
cmp eax, [DriverSize]
|
|
jne .errorfree
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
push dword [ebp+.file]
|
|
|
|
call _CloseFile
|
|
add esp, byte _CloseFile_arglen
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
push dword [DriverSize]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
push dword [DriverOffset]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
o16 push cs
|
|
|
|
call _LockArea
|
|
add esp, byte _LockArea_arglen
|
|
xor eax, eax
|
|
jmp short .done
|
|
|
|
.errorfree:
|
|
mov eax, [DriverSize]
|
|
neg eax
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
push eax
|
|
|
|
call ___sbrk
|
|
add esp, byte ___sbrk_arglen
|
|
mov dword [DriverOffset], 0
|
|
.error:
|
|
xor eax, eax
|
|
inc eax
|
|
.done:
|
|
pop gs
|
|
pop fs
|
|
pop es
|
|
mov esp, ebp
|
|
mov esp, ebp
|
|
pop ebp
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[global _InitGraphics]
|
|
_InitGraphics: push ebp
|
|
mov ebp, esp
|
|
|
|
|
|
.kbINT equ 8
|
|
|
|
|
|
.kbIRQ equ 12
|
|
|
|
|
|
.kbPort equ 16
|
|
|
|
|
|
|
|
push es
|
|
push fs
|
|
push gs
|
|
mov gs, [_djgpp_gs]
|
|
mov fs, [_djgpp_fs]
|
|
mov es, [_djgpp_es]
|
|
push esi
|
|
push edi
|
|
|
|
|
|
mov esi, [DriverOffset]
|
|
test esi, esi
|
|
jnz near .foundit
|
|
|
|
|
|
|
|
|
|
|
|
mov ecx, 256
|
|
mov esi, [___dos_argv0]
|
|
mov edi, Filename
|
|
.argv0copy:
|
|
mov al, [esi]
|
|
mov [edi], al
|
|
inc esi
|
|
inc edi
|
|
or al, al
|
|
jnz .argv0copy
|
|
|
|
.findlastslash:
|
|
cmp byte [edi], '/'
|
|
je .lastslashfound
|
|
cmp byte [edi], '\'
|
|
je .lastslashfound
|
|
cmp edi, Filename
|
|
je .lastslashnotfound
|
|
dec edi
|
|
jmp short .findlastslash
|
|
.lastslashfound:
|
|
inc edi
|
|
|
|
mov ecx, 10
|
|
mov esi, VBEAFName
|
|
rep movsb
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
push dword Filename
|
|
|
|
call _LoadGraphicsDriver
|
|
add esp, byte _LoadGraphicsDriver_arglen
|
|
test eax, eax
|
|
jz near .foundit
|
|
|
|
.lastslashnotfound:
|
|
|
|
mov edi, Filename
|
|
mov dword [edi], 'C:\v'
|
|
add edi, byte 3
|
|
mov esi, VBEAFName
|
|
mov ecx, 10
|
|
rep movsb
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
push dword Filename
|
|
|
|
call _LoadGraphicsDriver
|
|
add esp, byte _LoadGraphicsDriver_arglen
|
|
test eax, eax
|
|
jz .foundit
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
push dword VBEAFEnv
|
|
|
|
call _getenv
|
|
add esp, byte _getenv_arglen
|
|
test eax, eax
|
|
jz near .error
|
|
|
|
|
|
mov ecx, 256
|
|
mov esi, eax
|
|
mov edi, Filename
|
|
.envcopy:
|
|
mov al, [esi]
|
|
mov [edi], al
|
|
inc esi
|
|
inc edi
|
|
or al, al
|
|
jnz .envcopy
|
|
|
|
|
|
dec edi
|
|
cmp byte [edi], '/'
|
|
je .slashpresent
|
|
cmp byte [edi], '\'
|
|
je .slashpresent
|
|
mov byte [edi], '/'
|
|
.slashpresent:
|
|
|
|
inc edi
|
|
mov esi, VBEAFName
|
|
mov ecx, 10
|
|
rep movsb
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
push dword Filename
|
|
|
|
call _LoadGraphicsDriver
|
|
add esp, byte _LoadGraphicsDriver_arglen
|
|
test eax, eax
|
|
jz .foundit
|
|
|
|
jmp .error
|
|
.foundit:
|
|
mov esi, [DriverOffset]
|
|
|
|
|
|
cmp dword [esi+AF_DRIVER.Signature], 'VBEA'
|
|
jne near .errorfree
|
|
cmp dword [esi+AF_DRIVER.Signature+4], 'F.DR'
|
|
jne near .errorfree
|
|
cmp byte [esi+AF_DRIVER.Signature+8], 'V'
|
|
jne near .errorfree
|
|
|
|
|
|
cmp word [esi+AF_DRIVER.Version], 0200h
|
|
jb near .errorfree
|
|
|
|
|
|
mov edi, [esi+AF_DRIVER.OemExt]
|
|
add edi, esi
|
|
push dword (('I'<<24) | ('N'<<16) | ('I'<<8) | 'T')
|
|
push esi
|
|
call edi
|
|
add esp, byte 8
|
|
|
|
|
|
|
|
cmp al, '0'
|
|
jb .noext
|
|
cmp al, '9'
|
|
ja .noext
|
|
cmp ah, '0'
|
|
jb .noext
|
|
cmp al, '9'
|
|
ja .noext
|
|
|
|
and eax, 0FFFF0000h
|
|
cmp eax, (('E'<<24) | ('X'<<16) | (0<<8) | 0)
|
|
jne .noext
|
|
|
|
|
|
mov byte [FreeBEExt], 1
|
|
|
|
|
|
push dword (('D'<<24) | ('I'<<16) | ('C'<<8) | 'L')
|
|
push esi
|
|
call [esi+AF_DRIVER.OemExt]
|
|
add esp, byte 8
|
|
test eax, eax
|
|
jz .noext
|
|
|
|
mov dword [eax], _DispatchCall
|
|
|
|
.noext:
|
|
|
|
|
|
mov edi, [esi+AF_DRIVER.PlugAndPlayInit]
|
|
add edi, esi
|
|
mov ebx, esi
|
|
call edi
|
|
test eax, eax
|
|
jnz near .errorfree
|
|
|
|
mov esi, [DriverOffset]
|
|
|
|
|
|
|
|
|
|
mov edi, [esi+AF_DRIVER.InitDriver]
|
|
add edi, esi
|
|
mov ebx, esi
|
|
call edi
|
|
test eax, eax
|
|
jnz near .errorfree
|
|
|
|
mov esi, [DriverOffset]
|
|
|
|
|
|
cmp byte [FreeBEExt], 0
|
|
jz .defaultkb
|
|
|
|
|
|
push dword (('K'<<24) | ('E'<<16) | ('Y'<<8) | 'S')
|
|
push esi
|
|
call [esi+AF_DRIVER.OemExt]
|
|
add esp, byte 8
|
|
|
|
|
|
test eax, eax
|
|
jz .defaultkb
|
|
|
|
|
|
mov edi, eax
|
|
mov al, [edi+FAF_KEYBOARD_DATA.INT]
|
|
mov ebx, [ebp+.kbINT]
|
|
mov [ebx], al
|
|
mov al, [edi+FAF_KEYBOARD_DATA.IRQ]
|
|
mov ebx, [ebp+.kbIRQ]
|
|
mov [ebx], al
|
|
mov ax, [edi+FAF_KEYBOARD_DATA.Port]
|
|
mov ebx, [ebp+.kbPort]
|
|
mov [ebx], ax
|
|
|
|
jmp short .retokay
|
|
|
|
.defaultkb:
|
|
|
|
mov edi, [ebp+.kbINT]
|
|
mov byte [edi], 9
|
|
mov edi, [ebp+.kbIRQ]
|
|
mov byte [edi], 1
|
|
mov edi, [ebp+.kbPort]
|
|
mov word [edi], 60h
|
|
|
|
.retokay:
|
|
xor eax, eax
|
|
jmp short .done
|
|
|
|
.errorfree:
|
|
mov eax, [DriverSize]
|
|
neg eax
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
push eax
|
|
|
|
call ___sbrk
|
|
add esp, byte ___sbrk_arglen
|
|
mov dword [DriverOffset], 0
|
|
.error:
|
|
xor eax, eax
|
|
inc eax
|
|
.done:
|
|
pop edi
|
|
pop esi
|
|
pop gs
|
|
pop fs
|
|
pop es
|
|
mov esp, ebp
|
|
pop ebp
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[global _ExitGraphics]
|
|
_ExitGraphics
|
|
|
|
|
|
call _UnsetGraphicsMode
|
|
|
|
push es
|
|
push fs
|
|
push gs
|
|
mov gs, [_djgpp_gs]
|
|
mov fs, [_djgpp_fs]
|
|
mov es, [_djgpp_es]
|
|
push esi
|
|
|
|
|
|
mov esi, [DriverOffset]
|
|
test esi, esi
|
|
jz .notloaded
|
|
mov eax, [DriverSize]
|
|
neg eax
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
push eax
|
|
|
|
call ___sbrk
|
|
add esp, byte ___sbrk_arglen
|
|
mov dword [DriverOffset], 0
|
|
.notloaded:
|
|
|
|
pop esi
|
|
pop gs
|
|
pop fs
|
|
pop es
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[global _FindGraphicsMode]
|
|
_FindGraphicsMode: push ebp
|
|
mov ebp, esp
|
|
|
|
.Width equ 8
|
|
|
|
|
|
.Height equ 10
|
|
|
|
|
|
.Depth equ 12
|
|
|
|
|
|
.Emulated equ 14
|
|
|
|
|
|
|
|
push es
|
|
push fs
|
|
push gs
|
|
mov gs, [_djgpp_gs]
|
|
mov fs, [_djgpp_fs]
|
|
mov es, [_djgpp_es]
|
|
push esi
|
|
push edi
|
|
|
|
mov esi, [DriverOffset]
|
|
|
|
|
|
mov edi, [esi+AF_DRIVER.AvailableModes]
|
|
.modeloop:
|
|
cmp word [edi], -1
|
|
je .notfound
|
|
|
|
|
|
push dword ModeInfo
|
|
push dword [edi]
|
|
push esi
|
|
call [esi+AF_DRIVER.GetVideoModeInfo]
|
|
add esp, byte 12
|
|
test eax, eax
|
|
jnz .nextmode
|
|
|
|
|
|
mov ax, [ebp+.Width]
|
|
cmp [ModeInfo+AF_MODE_INFO.XResolution], ax
|
|
jne .nextmode
|
|
|
|
mov ax, [ebp+.Height]
|
|
cmp [ModeInfo+AF_MODE_INFO.YResolution], ax
|
|
jne .nextmode
|
|
|
|
mov ax, [ebp+.Depth]
|
|
cmp [ModeInfo+AF_MODE_INFO.BitsPerPixel], ax
|
|
jne .nextmode
|
|
|
|
|
|
mov eax, [ebp+.Emulated]
|
|
test eax, eax
|
|
jnz .foundit
|
|
|
|
|
|
mov eax, [ModeInfo+AF_MODE_INFO.VideoCapabilities]
|
|
cmp eax, (('E'<<24) | ('M'<<16) | ('U'<<8) | 'L')
|
|
jne .foundit
|
|
|
|
.nextmode:
|
|
add edi, byte 2
|
|
jmp short .modeloop
|
|
|
|
.foundit:
|
|
movzx eax, word [edi]
|
|
jmp short .done
|
|
.notfound:
|
|
xor eax, eax
|
|
.done:
|
|
pop edi
|
|
pop esi
|
|
pop gs
|
|
pop fs
|
|
pop es
|
|
mov esp, ebp
|
|
pop ebp
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[global _SetGraphicsMode]
|
|
_SetGraphicsMode: push ebp
|
|
mov ebp, esp
|
|
|
|
.Mode equ 8
|
|
|
|
|
|
|
|
push es
|
|
push fs
|
|
push gs
|
|
mov gs, [_djgpp_gs]
|
|
mov fs, [_djgpp_fs]
|
|
mov es, [_djgpp_es]
|
|
|
|
mov eax, [DriverOffset]
|
|
xor ecx, ecx
|
|
push ecx
|
|
inc ecx
|
|
push ecx
|
|
push dword ModeInfo+AF_MODE_INFO.BytesPerScanLine
|
|
movzx ecx, word [ModeInfo+AF_MODE_INFO.YResolution]
|
|
push ecx
|
|
movzx ecx, word [ModeInfo+AF_MODE_INFO.XResolution]
|
|
push ecx
|
|
push dword [ebp+.Mode]
|
|
push eax
|
|
call [eax+AF_DRIVER.SetVideoMode]
|
|
add esp, byte 28
|
|
|
|
|
|
mov byte [InGraphicsMode], 1
|
|
|
|
|
|
|
|
pop gs
|
|
pop fs
|
|
pop es
|
|
mov esp, ebp
|
|
pop ebp
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[global _UnsetGraphicsMode]
|
|
_UnsetGraphicsMode
|
|
|
|
|
|
cmp byte [InGraphicsMode], 0
|
|
jz .notingraphics
|
|
|
|
push es
|
|
push fs
|
|
push gs
|
|
mov gs, [_djgpp_gs]
|
|
mov fs, [_djgpp_fs]
|
|
mov es, [_djgpp_es]
|
|
push esi
|
|
push edi
|
|
|
|
|
|
mov esi, [DriverOffset]
|
|
|
|
|
|
mov edi, [esi+AF_DRIVER.EnableDirectAccess]
|
|
test edi, edi
|
|
jz .noEDA
|
|
push esi
|
|
call edi
|
|
add esp, byte 4
|
|
.noEDA:
|
|
|
|
mov edi, [esi+AF_DRIVER.WaitTillIdle]
|
|
test edi, edi
|
|
jz .noWTI
|
|
push esi
|
|
call edi
|
|
add esp, byte 4
|
|
.noWTI:
|
|
|
|
push esi
|
|
call [esi+AF_DRIVER.RestoreTextMode]
|
|
add esp, byte 4
|
|
|
|
|
|
mov byte [InGraphicsMode], 0
|
|
|
|
pop edi
|
|
pop esi
|
|
pop gs
|
|
pop fs
|
|
pop es
|
|
|
|
.notingraphics:
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[global _CopyToScreen]
|
|
_CopyToScreen: push ebp
|
|
mov ebp, esp
|
|
|
|
|
|
.Source equ 8
|
|
|
|
|
|
.SourcePitch equ 12
|
|
|
|
|
|
.SourceLeft equ 16
|
|
|
|
|
|
.SourceTop equ 20
|
|
|
|
|
|
.Width equ 24
|
|
|
|
|
|
.Height equ 28
|
|
|
|
|
|
.DestLeft equ 32
|
|
|
|
|
|
.DestTop equ 36
|
|
|
|
|
|
|
|
push es
|
|
push fs
|
|
push gs
|
|
mov gs, [_djgpp_gs]
|
|
mov fs, [_djgpp_fs]
|
|
mov es, [_djgpp_es]
|
|
push esi
|
|
|
|
mov esi, [DriverOffset]
|
|
cmp dword [esi+AF_DRIVER.BitBltSys], 0
|
|
jz .NoBitBltSys
|
|
|
|
|
|
|
|
push dword 0
|
|
push dword [ebp+.DestTop]
|
|
push dword [ebp+.DestLeft]
|
|
push dword [ebp+.Height]
|
|
push dword [ebp+.Width]
|
|
push dword [ebp+.SourceTop]
|
|
push dword [ebp+.SourceLeft]
|
|
push dword [ebp+.SourcePitch]
|
|
push dword [ebp+.Source]
|
|
push esi
|
|
call [esi+AF_DRIVER.BitBltSys]
|
|
add esp, byte 40
|
|
|
|
|
|
.NoBitBltSys:
|
|
|
|
|
|
.done:
|
|
pop esi
|
|
pop gs
|
|
pop fs
|
|
pop es
|
|
mov esp, ebp
|
|
pop ebp
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[global _DispatchCall]
|
|
_DispatchCall: push ebp
|
|
mov ebp, esp
|
|
|
|
|
|
.Handle equ 8
|
|
|
|
|
|
.Command equ 12
|
|
|
|
|
|
.Data equ 16
|
|
|
|
|
|
|
|
push fs
|
|
push esi
|
|
|
|
mov eax, ds
|
|
mov fs, eax
|
|
|
|
mov eax, [ebp+.Command]
|
|
shl eax, 16
|
|
mov ax, [ebp+.Handle]
|
|
clc
|
|
mov esi, [ebp+.Data]
|
|
db 0C4h, 0C4h, 058h, 002h
|
|
salc
|
|
movsx eax, al
|
|
|
|
pop esi
|
|
pop fs
|
|
mov esp, ebp
|
|
pop ebp
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|