📄 gpminit.inc
字号:
; dw 0
; dw 0de00h
; int 3
push es ; save on entry (es)
push bios_data_seg ; BIOS standard data segment
pop es ;
movzx cx,byte ptr es:winch_number ; (cx) = # of IDE drives in system
; (CX) SHOULD CONTAIN # OF IDE DRIVES SUPPORTED BY THE MAIN CORE BIOS.....IMPORTANT IMPORTANT......
; ANOTHER ASSUMPTION HERE IS IDE DRIVES CONTROLLED BY MAIN CORE BIOS
; START WITH 80H............IMPORTANT IMPORTANT........
cmp cx,no_of_ide_drv_supported ; is more than supported drive ?
jbe short setup_ide_data_area_01 ; no...
mov cx,no_of_ide_drv_supported ;
setup_ide_data_area_01:
or cl,cl ; any ide drive present ?
jz short setup_ide_data_area_10 ; no...
push es
push 0
pop es
mov si,es:[13h*4]
mov ax,es:[13h*4+2]
mov es,ax
mov ax,es:[si+1]
add si,ax
add si,6
mov ax,es:[si]
mov es,ax
mov dl,es:[100h]
pop es
mov ax,0400h
_next_drv:
mov dh,dl
and dh,03h
cmp dh,01h ; HDD ?
jnz @f
inc al
@@:
cmp dh,02h ; CD-ROM?
jnz @f
xchg ah,cl
mov dh,00010000b
shr dh,cl
; or byte ptr ds:[atapi_byte],dh
xchg ah,cl
@@:
ror dl,2
dec ah
jnz _next_drv
or ax,ax
jz short setup_ide_data_area_10 ; no...
xchg ax,cx
mov dx,80h ; start from drive 80h
push ax
mov al,Q_FIRST_BOOT_DRIVE
call check_cmos_data_far
cmp al,0ah ; SCSI boot?
pop ax
jnz setup_ide_data_area_00
sub ax,cx
add dx,ax
setup_ide_data_area_00:
push cx ;
mov si,ext_drv_param ; (si) = buffer address to get extended drive parameters
mov word ptr [si+ms_info_size],struc_ext_drv_param_size
call setup_individual_ide ; setup individual IDE drive
pop cx ;
inc dx ; next drive #
loop setup_ide_data_area_00 ; do for all drives present in the system
setup_ide_data_area_10:
pop es ;
popad ;
ret
setup_ide_data_area endp
;---------------------------------------------------------------;
; SETUP_INDIVIDUAL_IDE ;
;---------------------------------------------------------------;
; Input : (DS) PM BIOS data segment ;
; (DX) drive # (80h,81h etc.) ;
; (DS:SI) buffer for extended drive parameter ;
; Output: NONE ;
; Register destroyed : (ES),(AX),(BX),(CX),(SI) ;
; NOTE : If main core bios provide fixed address for extended ;
; drive parameter, then following code can be reduced. ;
; Following code still required if IDE drives are ;
; controlled from optional rom. ;
;---------------------------------------------------------------;
setup_individual_ide proc near
push dx ; (dx) = save drive #
mov ah,int_13_ext_func_41 ; check extensions present (MICROSOFT)
mov bx,055aah ;
int 13h ;
jc short setup_individual_ide_10 ; error...extension not present
cmp bx,0aa55h ; extension present ?
jnz short setup_individual_ide_10 ; no...
pop dx ; (dx) = restore drive #
push dx ; (dx) = save drive #
mov ah,int_13_ext_func_48 ; get drive parameters
int 13h ;
jc short setup_individual_ide_10 ; error...function not supported
cmp dword ptr [si+wd_extended_table],0ffffffffh; valid address ?
jz short setup_individual_ide_10 ; no...
pop dx ; (dx) = restore drive #
les si,[si+wd_extended_table] ; (es:si) = pointer to extended table
call setup_ext_ide_spl_info ;
ret
setup_individual_ide_10:
pop dx ; (dx) = restore drive #
call setup_ide_spl_info ;
ret
setup_individual_ide endp
;---------------------------------------------------------------;
; SETUP_IDE_SPL_INFO ;
;---------------------------------------------------------------;
; Input : (DX) drive # (80h,81h...etc) ;
; (DS) PM BIOS data segment ;
; Output: NONE ;
; Register destroyed : (BX) ;
;---------------------------------------------------------------;
setup_ide_spl_info proc near
cmp dl,80h ; drive # 80h ?
jnz short setup_ide_spl_info_00 ; no...
mov bx,hdd_0_control_struc ; drive 0 of primary controller
mov byte ptr [bx+hdd_misc_control_info],00011110b; IRQ level 14
; drive present
; primary controller
; master drive
ret
setup_ide_spl_info_00:
cmp dl,81h ; drive # 81h ?
jnz short setup_ide_spl_info_01 ; no...exit
mov bx,hdd_1_control_struc ; drive 1 of primary controller
mov byte ptr [bx+hdd_misc_control_info],10011110b; IRQ level 14
; drive present
; primary controller
; slave drive
setup_ide_spl_info_01:
ret
setup_ide_spl_info endp
;---------------------------------------------------------------;
; SETUP_EXT_IDE_SPL_INFO ;
;---------------------------------------------------------------;
; Input : (DX) drive # (80h,81h...etc) ;
; (ES:SI) pointer to extended table ;
; (DS) PM BIOS data segment ;
; Output: NONE ;
; Register destroyed : (AX),(BX) ;
;---------------------------------------------------------------;
setup_ext_ide_spl_info proc near
mov al,es:[si+wd_irq] ; (al) = IRQ level
and ax,0000000000001111b ; clear upper nibble
bts ds:gpm_ide_irq_usage,ax ; set proper bit for IRQ usage
test byte ptr es:[si+wd_hdd_misc_info_00],wd_drive_0_1_bit; drive 1 of the controller ?
jz short ext_ide_spl_info_01 ; no...
or al,hdd_drive_select_bit_equ ; set for drive 1 of the controller
ext_ide_spl_info_01:
cmp word ptr es:[si+wd_ide_base_addr],primary_ide_cntlr; primary ide controller ?
jz short ext_ide_spl_info_04 ; yes...
cmp word ptr es:[si+wd_ide_base_addr],secondary_ide_cntlr; secondary ide controller ?
jnz short ext_ide_spl_info_03 ; no...
or al,hdd_port_select_bit_equ ; set for secondary controller
mov bx,hdd_2_control_struc ; drive 0 of secondary controller
ext_ide_spl_info_02:
test al,hdd_drive_select_bit_equ ; drive 1 of primary/secondary controller ?
jz short ext_ide_spl_info_05 ; no...drive 0
add bx,struc_hdd_x_info_size ; point to drive 1 table of primary/secondary controller
ext_ide_spl_info_05:
or al,hdd_present_bit_equ ; set for drive present
mov [bx+hdd_misc_control_info],al ;
ext_ide_spl_info_03:
ret
ext_ide_spl_info_04:
mov bx,hdd_0_control_struc ; drive 0 of primary controller
jmp short ext_ide_spl_info_02 ;
setup_ext_ide_spl_info endp
;---------------------------------------------------------------;
;*****************************************************************;
;*****************************************************************;
;** **;
;** (C)Copyright 1985-1996, American Megatrends Inc. **;
;** **;
;** All Rights Reserved. **;
;** **;
;** 6145-F, Northbelt Parkway, Norcross, **;
;** **;
;** Georgia - 30071, USA. Phone-(770)-246-8600. **;
;** **;
;*****************************************************************;
;*****************************************************************;
;---------------------------------------------------------------;
; ROUTINES FOR SETTING UP DISPLAY DATA AREA ;
;---------------------------------------------------------------;
; SETUP_DISP_DATA_AREA ;
;---------------------------------------------------------------;
; Input : (DS) PM BIOS data segment ;
; Output: NONE ;
; Register destroyed : NONE ;
;---------------------------------------------------------------;
setup_disp_data_area proc near
pusha ;
push es ;
mov ax,vesa_ext_func*256+vesa_vbe_pm_services_func ; extended VESA VBE/PM function call
mov cx,0000h ; (cx) = currently consider primary controller only
mov bl,report_vbe_pm_support_info ; (bl) = sub function...report vbe/pm capabilities
xor di,di ;
mov es,di ; (es:di) should be null pointer for VBE/PM v1.0
int 10h ; execute the function
mov si,disp_0_control_struc ; (si) = control information for primary controller
mov byte ptr [si+disp_misc_control_info],00000000b; set for primar controller &
; vbe/pm interface not supported
cmp ax,00h*256+vesa_ext_func ; VESA VBE/PM extension supported ?
jnz short setup_disp_data_area_00 ; no...
and bh,vbe_pm_standby_bit or vbe_pm_suspend_bit or vbe_pm_off_bit or vbe_pm_reduced_on_bit
; any of the power saving mode supported ?
jz short setup_disp_data_area_00 ; no...
or byte ptr [si+disp_misc_control_info],vbe_pm_interface_supported
mov [si+disp_vbe_supported_power_mode],bh
mov [si+disp_vbe_ver_no],bl ;
setup_disp_data_area_00:
pop es ;
popa ;
ret
setup_disp_data_area endp
;---------------------------------------------------------------;
;*****************************************************************;
;*****************************************************************;
;** **;
;** (C)Copyright 1985-1996, American Megatrends Inc. **;
;** **;
;** All Rights Reserved. **;
;** **;
;** 6145-F, Northbelt Parkway, Norcross, **;
;** **;
;** Georgia - 30071, USA. Phone-(770)-246-8600. **;
;** **;
;*****************************************************************;
;*****************************************************************;
;---------------------------------------------------------------;
; SAVE_PM_METHOD ;
;---------------------------------------------------------------;
; Input : (AL) 00h disable power management ;
; 01h use SMI power management method ;
; 02h use hardware auto power management method
; 03h use IRQ based power management ;
; (BL) bit 7 set, cpu has SMI support ;
; STACK PRESENT ;
; Output: (AL) 00h disable power management ;
; 01h use SMI power management method ;
; 02h use hardware auto power management method
; 03h use IRQ based power management ;
; Register destroyed : (AL) under certain cases ;
;---------------------------------------------------------------;
save_pm_method proc near
push ds ;
push bios_data_seg ;
pop ds ; (ds) = bios standard data segment (40H)
cmp al,1 ; use SMI based power management ?
jnz short save_pm_method_00 ; no...
test bl,10000000b ; cpu has SMI support ?
jnz short save_pm_method_00 ; yes...
xor al,al ; convert to disable power management
save_pm_method_00:
and al,00000011b ; consider power management method bits
shl al,4 ; take it to bits 5,4
and sys_info,11001111b ; clear bits 5,4
or sys_info,al ;
shr al,4 ; get power management method bits in 1,0
pop ds ;
ret
save_pm_method endp
;---------------------------------------------------------------;
;*****************************************************************;
;*****************************************************************;
;** **;
;** (C)Copyright 1985-1996, American Megatrends Inc. **;
;** **;
;** All Rights Reserved. **;
;** **;
;** 6145-F, Northbelt Parkway, Norcross, **;
;** **;
;** Georgia - 30071, USA. Phone-(770)-246-8600. **;
;** **;
;*****************************************************************;
;*****************************************************************;
;---------------------------------------------------------------;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -