;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; RDOS operating system ; Copyright (C) 1988-2000, Leif Ekblad ; ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation; either version 2 of the License, or ; (at your option) any later version. The only exception to this rule ; is for commercial usage in embedded systems. For information on ; usage in commercial embedded systems, contact embedded@rdos.net ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program; if not, write to the Free Software ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; ; The author of this program may be contacted at leif@rdos.net ; ; VGA.ASM ; VGA/VESA based video device driver ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; INCLUDE ..\driver.def INCLUDE ..\user.def INCLUDE ..\os.def INCLUDE ..\user.inc INCLUDE ..\os.inc INCLUDE ..\os\protseg.def INCLUDE vbe.inc VIDEO_MODE_FLAGS_PM EQU 1 VIDEO_MODE_FLAGS_LFB EQU 2 video_resol_struc STRUC vr_next DW ? vr_x_size DW ? vr_y_size DW ? vr_flat16_mode DW ? vr_flat24_mode DW ? vr_flat32_mode DW ? vr_flat16_flags DB ? vr_flat24_flags DB ? vr_flat32_flags DB ? video_resol_struc ENDS data SEGMENT byte public 'DATA' v_video_mem DD ? v_cap DW ? v_init_proc DW ? v_set_window_proc DW ? v_set_start_proc DW ? v_set_palette_proc DW ? v_major_ver DB ? v_minor_ver DB ? v_pm16_stack DW ? v_pm16_entry DD ? v_pm32_io DW ? v_pm32_data_sel DW ? v_pm32_code_sel DW ? v_video_resol_list DW ? data ENDS .386p code SEGMENT byte public use16 'CODE' assume cs:code ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: DecodeVideoMode ; ; DESCRIPTION: Decode a video mode ; ; PARAMETERS: DS PC video sel ; AX 0 = V86, 1 = PM ; CX Mode # ; ES Video mode info block ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DecodeVideoMode Proc near mov dx,es:vmi_mode_attrib and dx,MODE_ATTRIB_REQUIRED cmp dx,MODE_ATTRIB_REQUIRED jne decode_video_mode_done ; mov dl,es:vmi_memory_model cmp dl,MODEL_DIRECT jne decode_video_mode_done ; pushad mov bx,cx movzx ax,es:vmi_bits_per_pixel mov cx,es:vmi_x_pixels mov dx,es:vmi_y_pixels mov si,es:vmi_scan_lines mov edi,es:vmi_lfb AddVideoMode popad decode_video_mode_done: ret DecodeVideoMode Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GetVideoModesPm ; ; DESCRIPTION: Get all video modes, protected mode version ; ; PARAMETERS: ES Info selector ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GetVideoModesPm Proc near push ds push es push fs pusha ; mov ax,SEG data mov ds,ax lfs si,es:vesa_modes mov eax,1000h AllocateGlobalMem xor di,di get_video_modes_pm_loop: mov cx,fs:[si] add si,2 cmp cx,-1 je get_video_modes_pm_done ; mov ax,ds:v_pm16_stack mov bp,ss shl ebp,16 mov bp,sp mov ss,ax mov sp,1024 push ebp mov ax,4F01h call ds:v_pm16_entry pop ebp cmp ax,4Fh mov ax,bp pushf shr ebp,16 popf mov ss,ax mov sp,bp jne get_video_modes_pm_loop ; mov ax,1 call DecodeVideoMode jnc get_video_modes_pm_loop ; mov ax,4F01h push 10h V86BiosInt cmp ax,4Fh jne get_video_modes_pm_loop ; xor ax,ax call DecodeVideoMode ; jmp get_video_modes_pm_loop get_video_modes_pm_done: ; FreeMem ; popa pop fs pop es pop ds ret GetVideoModesPm Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GetVideoModesV86 ; ; DESCRIPTION: Get all video modes, V86 mode version ; ; PARAMETERS: ES Info selector ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GetVideoModesV86 Proc near push ds push es push fs pusha ; mov ax,word ptr es:vesa_modes+2 cmp ax,2000h jne get_video_modes_v86_not_self ; mov ax,es mov fs,ax jmp get_video_modes_v86_do get_video_modes_v86_not_self: cmp ax,0C000h jne get_video_modes_v86_done ; mov ax,__C000 mov fs,ax get_video_modes_v86_do: mov si,word ptr es:vesa_modes mov eax,1000h AllocateGlobalMem xor di,di get_video_modes_v86_loop: mov cx,fs:[si] add si,2 cmp cx,-1 je get_video_modes_v86_free ; xor ax,ax mov ds,ax mov ax,4F01h push 10h V86BiosInt cmp ax,4Fh jne get_video_modes_v86_loop ; mov ax,SEG data mov ds,ax xor ax,ax call DecodeVideoMode jmp get_video_modes_v86_loop get_video_modes_v86_free: ; FreeMem get_video_modes_v86_done: popa pop fs pop es pop ds ret GetVideoModesV86 Endp vesa_id DB 'VESA' ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SetWindowV86 ; ; DESCRIPTION: V86 SetWindow ; ; PARAMETERS: BL Window A/B ; DX Window # ; ; RETURNS: AX Status ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SetWindowV86 Proc near push ds push es ; xor ax,ax mov ds,ax mov es,ax xor bh,bh push 10h mov ax,4F05h V86BiosInt ; pop es pop ds ret SetWindowV86 Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SetStartV86 ; ; DESCRIPTION: V86 SetStart ; ; PARAMETERS: CX First pixel ; DX First line ; ; RETURNS: AX Status ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SetStartV86 Proc near push ds push es ; xor ax,ax xor bx,bx mov ds,ax mov es,ax push 10h mov ax,4F07h V86BiosInt ; pop es pop ds ret SetStartV86 Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SetPaletteV86 ; ; DESCRIPTION: V86 SetPalette ; ; PARAMETERS: CX Palette entries ; DX First entry ; ES:DI Palette data ; ; RETURNS: AX Status ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SetPaletteV86 Proc near push ds ; xor bl,bl xor ax,ax mov ds,ax push 10h mov ax,4F09h V86BiosInt ; pop ds ret SetPaletteV86 Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SetWindowPm16 ; ; DESCRIPTION: 16-bit protected mode SetWindow ; ; PARAMETERS: BL Window A/B ; DX Window # ; ; RETURNS: AX Status ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SetWindowPm16 Proc near push ds push si push bp ; xor bh,bh mov ax,SEG data mov ds,ax mov ax,ds:v_pm16_stack mov bp,ss shl ebp,16 mov bp,sp mov ss,ax mov sp,1024 push ebp mov ax,4F05h call ds:v_pm16_entry pop ebp mov si,bp shr ebp,16 mov ss,si mov sp,bp ; pop bp pop si pop ds ret SetWindowPm16 Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SeStartPm16 ; ; DESCRIPTION: 16-bit protected mode SetStart ; ; PARAMETERS: CX First pixel ; DX First line ; ; RETURNS: AX Status ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SetStartPm16 Proc near push ds push bp ; xor bx,bx mov ax,SEG data mov ds,ax mov ax,ds:v_pm16_stack mov bp,ss shl ebp,16 mov bp,sp mov ss,ax mov sp,1024 push ebp mov ax,4F07h call ds:v_pm16_entry pop ebp mov si,bp shr ebp,16 mov ss,si mov sp,bp ; pop bp pop si pop ds ret SetStartPm16 Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SetPalettePm16 ; ; DESCRIPTION: 16-bit protected mode SetPalette ; ; PARAMETERS: CX Palette entries ; DX First entry ; ES:DI Palette data ; ; RETURNS: AX Status ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SetPalettePm16 Proc near push ds push bp ; mov ax,SEG data mov ds,ax mov ax,ds:v_pm16_stack mov bp,ss shl ebp,16 mov bp,sp mov ss,ax mov sp,1024 push ebp mov ax,4F09h call ds:v_pm16_entry pop ebp mov si,bp shr ebp,16 mov ss,si mov sp,bp ; pop bp pop si pop ds ret SetPalettePm16 Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SetWindowPm32 ; ; DESCRIPTION: 32-bit protected mode SetWindow ; ; PARAMETERS: BL Window A/B ; DX Window # ; ; RETURNS: AX Status ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SetWindowPm32 Proc near push ds push es push gs push si ; xor bh,bh mov ax,SEG data mov gs,ax mov ax,gs:v_pm32_data_sel mov ds,ax mov es,gs:v_pm32_io mov bp,ss shl ebp,16 mov bp,sp mov ss,ax mov sp,1000h push ebp sub sp,8 mov bp,sp mov dword ptr [bp],100h mov ax,gs:v_pm32_code_sel mov [bp+4],ax mov ax,4F05h call fword ptr [bp] add sp,8 pop ebp ; mov si,bp shr ebp,16 mov ss,si mov sp,bp ; pop si pop gs pop es pop ds ret SetWindowPm32 Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SetStartPm32 ; ; DESCRIPTION: 32-bit protected mode SetStart ; ; PARAMETERS: CX First pixel ; DX First line ; ; RETURNS: AX Status ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SetStartPm32 Proc near push ds push es push gs push si ; xor bx,bx mov ax,SEG data mov gs,ax mov ax,gs:v_pm32_data_sel mov ds,ax mov es,gs:v_pm32_io mov bp,ss shl ebp,16 mov bp,sp mov ss,ax mov sp,1000h push ebp sub sp,8 mov bp,sp mov dword ptr [bp],108h mov ax,gs:v_pm32_code_sel mov [bp+4],ax mov ax,4F05h call fword ptr [bp] add sp,8 pop ebp ; mov si,bp shr ebp,16 mov ss,si mov sp,bp ; pop si pop gs pop es pop ds ret SetStartPm32 Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SetPalettePm32 ; ; DESCRIPTION: 32-bit protected mode SetPalette ; ; PARAMETERS: CX Palette entries ; DX First entry ; ES:DI Palette data ; ; RETURNS: AX Status ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SetPalettePm32 Proc near push ds push es push gs push si ; xor bh,bh mov ax,SEG data mov gs,ax mov ds,gs:v_pm32_io mov ax,gs:v_pm32_data_sel mov bp,ss shl ebp,16 mov bp,sp mov ss,ax mov sp,1000h push ebp sub sp,8 mov bp,sp mov dword ptr [bp],110h mov ax,gs:v_pm32_code_sel mov [bp+4],ax mov ax,4F05h call fword ptr [bp] add sp,8 pop ebp ; mov si,bp shr ebp,16 mov ss,si mov sp,bp ; pop si pop gs pop es pop ds ret SetPalettePm32 Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: InitPm ; ; DESCRIPTION: Protected mode init ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; InitPm Proc near push ds push es pushad ; mov ax,SEG data mov ds,ax mov eax,10000h AllocateGlobalMem xor di,di ; mov ax,ds:v_pm16_stack mov bp,ss shl ebp,16 mov bp,sp mov ss,ax mov sp,1024 push ebp ; mov ax,4F00h call ds:v_pm16_entry cmp ax,4Fh jne init_pm_leave ; mov eax,dword ptr es:vesa_name cmp eax,dword ptr cs:vesa_id jne init_pm_leave ; mov al,es:vesa_major_ver mov ds:v_major_ver,al mov al,es:vesa_minor_ver mov ds:v_minor_ver,al mov eax,es:vesa_cap mov ds:v_cap,ax mov ax,es:vesa_video_mem shl eax,16 mov ds:v_video_mem,eax pop ebp mov ax,bp shr ebp,16 mov ss,ax mov sp,bp call GetVideoModesPm jmp init_pm_free init_pm_leave: pop ebp mov ax,bp shr ebp,16 mov ss,ax mov sp,bp init_pm_free: ; FreeMem ; popad pop es pop ds ret InitPm Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: InitV86 ; ; DESCRIPTION: V86 mode init ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; InitV86 Proc near push ds push es pushad ; mov ax,SEG data mov ds,ax mov eax,11000h AllocateGlobalMem xor di,di ; push 10h mov ax,4F00h V86BiosInt cmp ax,4Fh jne init_v86_check_failed ; mov eax,dword ptr es:vesa_name cmp eax,dword ptr cs:vesa_id jne init_v86_check_failed ; mov al,es:vesa_major_ver mov ds:v_major_ver,al mov al,es:vesa_minor_ver mov ds:v_minor_ver,al mov eax,es:vesa_cap mov ds:v_cap,ax mov ax,es:vesa_video_mem shl eax,16 mov ds:v_video_mem,eax ; mov al,ds:v_major_ver cmp al,2 ; jc init_v86_calls ; mov bx,es GetSelectorBaseSize add edx,1000h sub ecx,1000h CreateDataSelector16 mov es,bx ; push ecx push edi ; xor al,al xor edi,edi rep stos byte ptr es:[edi] ; pop edi pop ecx ; mov ax,4F0Ah xor bl,bl push 10h V86BiosInt ; mov bx,es GetSelectorBaseSize sub edx,1000h add ecx,1000h CreateDataSelector16 mov es,bx ; cmp ax,4Fh jne init_v86_calls ; movzx edi,di add edi,1000h mov ebx,100h ; movzx eax,es:[edi].vpm_set_window add eax,edi sub eax,ebx sub eax,5 mov byte ptr es:[bx],0E8h mov es:[bx+1],eax mov byte ptr es:[bx+5],0CBh add bx,8 ; movzx eax,es:[edi].vpm_set_disp_start add eax,edi sub eax,ebx sub eax,5 mov byte ptr es:[bx],0E8h mov es:[bx+1],eax mov byte ptr es:[bx+5],0CBh add bx,8 ; movzx eax,es:[edi].vpm_set_palette add eax,edi sub eax,ebx sub eax,5 mov byte ptr es:[bx],0E8h mov es:[bx+1],eax mov byte ptr es:[bx+5],0CBh ; mov bx,es GetSelectorBaseSize ; AllocateGdt CreateCodeSelector32 mov ds:v_pm32_code_sel,bx ; AllocateGdt CreateDataSelector32 mov ds:v_pm32_data_sel,bx ; movzx ebx,es:[edi].vpm_table or bx,bx jz init_v86_memory_done ; add ebx,edi init_v86_io_loop: mov ax,es:[ebx] add ebx,2 cmp ax,-1 jne init_v86_io_loop ; mov ax,es:[ebx] cmp ax,-1 je init_v86_memory_done ; mov edx,es:[ebx] movzx eax,word ptr es:[ebx+4] ; push es dec eax and ax,0F000h add eax,1000h AllocateGlobalMem mov bx,es ; push edx GetSelectorBaseSize pop eax ; push ebx xor ebx,ebx shr ecx,12 or al,3 init_v86_memmap_loop: SetPageEntry add edx,1000h add eax,1000h sub ecx,1 jnz init_v86_memmap_loop ; pop ebx pop es ; mov ds:v_pm32_io,bx jmp init_v86_pm32 init_v86_memory_done: mov ds:v_pm32_io,0 init_v86_pm32: mov ds:v_set_window_proc,OFFSET SetWindowPm32 mov ds:v_set_start_proc,OFFSET SetStartPm32 mov ds:v_set_palette_proc,OFFSET SetPalettePm32 call GetVideoModesV86 jmp init_v86_check_done init_v86_calls: mov ds:v_set_window_proc,OFFSET SetWindowV86 mov ds:v_set_start_proc,OFFSET SetStartV86 mov ds:v_set_palette_proc,OFFSET SetPaletteV86 call GetVideoModesV86 ; mov bx,es GetSelectorBaseSize add edx,1000h sub ecx,1000h shr ecx,12 mov eax,2 xor ebx,ebx init_v86_free_loop: SetPageEntry add edx,1000h sub ecx,1 jnz init_v86_free_loop ; FreeMem jmp init_v86_check_done init_v86_check_failed: mov ds:v_major_ver,0 mov ds:v_minor_ver,0 FreeMem init_v86_check_done: popad pop es pop ds ret InitV86 Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SetupPmEntry ; ; DESCRIPTION: Setup Pm entry point ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; pm_id DB 'PMID' SetupPmEntry Proc near push ds push es pushad ; mov bx,__C000 mov ds,bx mov eax,10000h AllocateGlobalMem xor si,si xor di,di mov cx,4000h rep movsd ; mov eax,dword ptr cs:pm_id xor si,si mov cx,8000h ScanPmLoop: cmp eax,es:[si] jne ScanPmNext ; push cx push si mov cx,SIZE pm_info_block xor dl,dl ChksumPmLoop: add dl,es:[si] inc si loop ChksumPmLoop ; pop si pop cx or dl,dl jnz ScanPmNext ; push es mov eax,600h AllocateSmallGlobalMem xor di,di mov cx,180h xor eax,eax rep stosd mov bx,es pop es ; mov es:[si].pmi_bios_data,bx mov es:[si].pmi_A000,__A000 mov es:[si].pmi_B000,__B000 mov es:[si].pmi_B800,__B800 mov es:[si].pmi_C000,es mov es:[si].pmi_mode,1 mov bx,es GetSelectorBaseSize AllocateGdt CreateCodeSelector16 ; mov ax,SEG data mov ds,ax mov word ptr ds:v_pm16_entry+2,bx mov ax,es:[si].pmi_entry_point mov word ptr ds:v_pm16_entry,ax mov ds:v_init_proc,OFFSET InitPm mov ds:v_set_window_proc,OFFSET SetWindowPm16 mov ds:v_set_start_proc,OFFSET SetStartPm16 mov ds:v_set_palette_proc,OFFSET SetPalettePm16 ; mov eax,1024 AllocateSmallGlobalMem mov ds:v_pm16_stack,es jmp SetupVm ; mov ax,es mov es,bx mov bp,ss shl ebp,16 mov bp,sp mov ss,ax mov sp,1024 push ebp ; stc push cs push OFFSET SetupPmInitRet push es push es:[si].pmi_init retf SetupPmInitRet: pop ebp mov ax,bp pushf shr ebp,16 popf mov ss,bp mov sp,ax jnc SetupPmDone jmp SetupVm ScanPmNext: inc si sub cx,1 jnz ScanPmLoop SetupVm: FreeMem mov ax,SEG data mov ds,ax mov ds:v_init_proc,OFFSET InitV86 SetupPmDone: popad pop es pop ds ret SetupPmEntry Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: test_thread ; ; DESCRIPTION: test thread ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; vbe_thread_name DB 'VBE',0 vbe_thread: call SetupPmEntry mov ax,SEG data mov ds,ax call ds:v_init_proc TerminateThread ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: init_vbe_thread ; ; DESCRIPTION: Create initial VBE thread ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; init_vbe_thread PROC far push ds push es pusha mov ax,cs mov ds,ax mov es,ax ; mov si,OFFSET vbe_thread mov di,OFFSET vbe_thread_name mov cx,stack0_size mov ax,4 CreateThread ; popa pop es pop ds retf32 init_vbe_thread ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: INIT ; ; DESCRIPTION: Init device ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; init PROC far mov ax,cs mov ds,ax mov es,ax mov edi,OFFSET init_vbe_thread HookInitPci clc ret init ENDP code ENDS END init