⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpminit.inc

📁 本源码为BIOS研发技术剖析光盘原代码,是SIS530BIOS完整原代码.
💻 INC
📖 第 1 页 / 共 4 页
字号:
;	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 + -