[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