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

📄 pcipost.asm

📁 awardbios源文件.供喜欢研究底层技术人员参考学习.
💻 ASM
📖 第 1 页 / 共 5 页
字号:
		or	dh,40h
Not16KUnit:
endif	;SHADOW_UNIT_64K			;R82
;R80		and	bx,dx
		and	ebx, edx		;R80 mask bits for size check
ChkRomSize:	  				;
		add	ebx,ecx
		cmp	ebx,edi			;size over one shadow
		jb	short ChkRomSize	;unit ?

		sub	ebx,edi			;remainder size to declare
		jz	short PatchRomExit	;ROM size is aligned

		extrn	Build_MbRomDynamicNode:near
		call	Build_MbRomDynamicNode 	;build ROM node

PatchRomExit:

endif;	PNP_BIOS
		ret
PatchRomAlignMent	endp

ifdef	COMBINE_ISA_ROM
;-----------------------------------------------------------
;Function : Initial option ISA ROM added by switch /other
;
;Input    : none
;
;Output   : LMEM_RESOURCE[bp] modified by option ROM size
;-----------------------------------------------------------
Init_Other_ROMs	proc	near

		pushad

		mov	edi, 800h			; 1800:0

	Scan_Other_Combine_Isa_ROM:

		push	edi

		call	Find_Valid_ROM_Image 	 	;any of them valid?
		jc	No_OtherRom			;no valid !

	;if it is a PCI ROM, skip it

		mov	di, word ptr ds:[18h]
		cmp	dword ptr ds:[di], 'RICP'
		je	No_OtherRom

		mov	byte ptr LMEM_FOR_ROM_FLG[bp], 1;shadow RAM for ROM

		mov	cl, ds:[2]			;get ROM size
		xor	ch, ch
		shr	cx, 3				;by 4k unit
		adc	cx, 0
		push	cx				;save rom size

		push	dword ptr LMEM_RESOURCE[bp]
		call	EGet_Available_LMEM     	;ask for LOW MEM
		pop	dword ptr LMEM_RESOURCE[bp]
		pop	cx				;restore rom size
		jc	No_OtherRom			;no shadow available

		mov	edi, AVAIL_LMEM_ADDR[bp]	;EDI: available shadow RAM
		shr	edi, 4				;DI: destination SEG

		mov	al, 1				;copy according to CX
		call	ECopy_ROM			;copy ROM to shadow

		call 	Init_ROM			;invoke NCR810 ROM

	;Recalculate available low memory size due to ROM size changed

		mov	eax, AVAIL_LMEM_ADDR[bp]
		mov	TARGET_AVAIL_LMEM[bp], eax
		shr	eax, 4
		call	Recalibrate_LMEM_For_ROM

ifdef	PNP_BIOS
	;build memory used by Motherboard to prevent SCT test failure
		mov	edi, AVAIL_LMEM_ADDR[bp]	;EDI: available shadow RAM
		call	Build_OtherRomNode
endif;	PNP_BIOS

No_OtherRom:

		pop	edi
		add	di, 0080h
		cmp	di, 2000h
		jb	Scan_Other_Combine_Isa_ROM

		popad
		ret

Init_Other_ROMs	endp
endif;	COMBINE_ISA_ROM

;[]==============================================================[]
;Pci_CbRom_decompress:
;
;Description:
;
;
;Input : compress_bp_start = option ROM start index (depand on CBROM.EXE utility)
;	 compress_bp_end = option ROM end index (depand on CBROM.EXE utility)
;        decompress_add_start = device and vender ID store buffer start address
;Output: None
;
;  - 200000h (start)
;  |	VGA Drive Rom Vendor & Device ID and potect_mode address
;  |	Index.
;  - 20002fh (end)
;  - 200030h (start)
;  |	VGA Drive Rom Vendor & Device ID and potect_mode address
;  |	Index.
;  - 2000A0h (end)
;  - 200100h (start)
;  |
;  |
;  |	All VGA & PCI Device ROM decompress pool.
;  |
;  |
;  -
;[]==============================================================[]
		ALIGN	4
		Public	fProc_Pci_CbRom_decompress
fProc_Pci_CbRom_decompress	Proc	Far

		push	ds
		push	es
		mov	esi, 200100h			;temp store decompress code address start
		mov	ax, CBROM_BP_START[bp]
		mov	di, ax
		mov	edx, CBROM_BUF_START[bp]

Decomp_PCI_Loop:

		push	edx
		push	esi				;push temp store decompress code address start to stack
		push	di
		call	POST_decompress			;decompress cbrom pool
		pop	di
		pop	esi				;pop temp store decompress code address start from stack
		pop	edx
		jc	NO_PCI_TABLE

		push	ebx			;R84 store original ROM size
		mov	bx, Temp_EXP_Seg
		mov	es, bx
;R55	ifdef	Flash_2M_support
;R55		mov	ebx, 160000h			;extra option ROM temp address
;R55;717;		cmp	es:[di+Temp_EXP_Off+2], 8000h	;first segment
;R55		cmp	es:[di+Temp_EXP_Off+2],POST_Cmprsed_Temp_Seg	;717 first segment
;R55		je	@F				;Yes, skip
;R55		add	ebx, 10000h			;set to next sgment (170000h)
;R55	@@:
;R55		add	bx, es:[di+Temp_EXP_Off]	;set to physical address
;R55	else	;Flash_2M_support
;R55		xor	ebx, ebx
;R55		mov	bx, es:[di+Temp_EXP_Off+2]
;R55		shl	ebx, 4
;R55		mov	bx, es:[di+Temp_EXP_Off]
;R55	endif	;Flash_2M_support
		call	combined_isa_addr	;R55
		pop	ebx			;R84 restore original ROM size
		push	di
		push	es
		push	edx
		push	esi				;push temp store decompress code address start to stack

;-----------------------           -----------------------------

		push	ebx			;R84 store original ROM size
		cli
		call	E000_A20_On
		call	E000_Enter_Prot_mode		;enter protected mode
		mov	ax, ds
		mov	es, ax
		call	E000_Back_Real_Mode
;R84		mov	ecx, es:[ebx+0bh]
		pop	ecx			;R84 restore original ROM size
		add	ecx, 3
		and	ecx, not 3
;717;		mov	esi, 40000h
		mov	esi,(POST_Decompress_Seg shl 4)	;;;;;717;
		pop	edi				;pop temp store decompress code address start from stack

		pop	edx
;717		mov	ebx, 40000h
		mov	ebx,(POST_Decompress_Seg shl 4)	;;;;;717;
		mov	bx, ds:[esi+18h]		;point to PCIR offset
		mov	eax, ds:[ebx+4]			;get Vendor and Device ID from option ROM
		mov	es:[edx], eax			;store to temp buffer
		mov	es:[edx+4], edi			;store physical address to temp buffer
		add	edx, 8

		shr	ecx, 2
		cld
;717;		cmp	byte ptr PCI_CBROM_TEMP[bp], 0
;717;		jne	@F
		cmp	dword ptr ds:[70000h], 0AA55h
		je	@F
		pushad
		mov	edi, 70000h
 		db	67h
 		rep	movsd				;move original option ROM code to
		popad
	@@:
 		db	67h
 		rep	movsd				;move original option ROM code to
							;protect mode temp address from 200100h
		push	edi

		call	E000_A20_Off
;----------------------------------------------------
		pop	esi
		pop	es
		pop	di
NO_PCI_TABLE:
		add	di, 4
		mov	ax, CBROM_BP_END[bp]
		cmp	di, ax
		jb	Decomp_PCI_Loop

;717;		cmp	byte ptr PCI_CBROM_TEMP[bp], -1	;is't PCI flag for pci_cbrom_decompress subroutine
;717;		jne	Pci_CbRom_decompress_End
;717;
;717;	;-------------------------------
;717;
;717;		mov	ax, 800h
;717;
;717;	Compatible_Move:
;717;
;717;		push	ax
;717;
;717;		mov	ds, ax
;717;		cmp	ds:[0], 0AA55h			;800:0h have pci Decice rom ?
;717;		jne	No_ROM_Here
;717;
;717;		push	ds
;717;		push	esi
;717;		mov	bx, ds:[18h]
;717;		mov	eax, ds:[bx+4]
;717;
;717;		mov	cx, ds:[2]
;717;		shl	cx, 9
;717;		push	eax
;717;		push	cx
;717;		call	E000_Enter_Prot_Mode
;717;		call	E000_Back_Real_Mode
;717;		pop	cx
;717;		pop	eax
;717;		pop	edi
;717;		pop	si
;717;		movzx	esi, si
;717;		shl	esi, 4
;717;
;717;		mov	dword ptr ds:[edx], eax
;717;		mov	dword ptr ds:[edx+4], edi
;717;		add	edx, 8
;717;	@@:
;717;		mov	eax, ds:[esi]
;717;		mov     ds:[edi], eax
;717;		add	edi, 4
;717;		add	esi, 4
;717;		loop	@B
;717;
;717;		push	edi
;717;		pop	esi
;717;
;717;	No_ROM_Here:
;717;
;717;		pop	ax
;717;		cmp	ax, 1000h
;717;		mov	ax, 1000h
;717;		jne	Compatible_Move
;717;
;717;	Pci_CbRom_decompress_End:

		pop	es
		pop	ds
		ret

fProc_Pci_CbRom_decompress	endp

;[]-------------------------------------------------------------------[]
;Function : Build PCI/IRQ routing table for Microsoft specification
;Input    : none
;Output   : none
;[]-------------------------------------------------------------------[]
		public	Build_MsPciIrq
Build_MsPciIrq	proc	near

IF	MSIRQROUT_SUPPORT

		F000_CALL F000_Shadow_W

		mov	si, offset MsPciIrqTbl
		mov	ax, SEG MsPciIrqTbl
		mov	ds, ax

IF	USB_ONBOARD
		pushad
		mov	ax, 0B109h		;read word
		mov	bx, USB_ONBOARD		;bus, dev & func no
		xor	di, di			;reg 0 (Vendor ID)
		int	1Ah			;invoke PCI read
		cmp	cx, 0FFFFh		;USB controller exist?
		popad
		jne	@F			;yes!

		sub	word ptr ds:[si+6], 16	;change the table size
		mov	di, offset PciIrqTbl_Size
		sub	word ptr ds:[di], 16
	@@:
ENDIF	;USB_ONBOARD

		mov	cx, [si+6]		;No. of byte for checksum
		cld
		xor	ah, ah			;initial
NextMsPciByte:
		lodsb
		add	ah, al
		loop	NextMsPciByte

		not	ah			;invert byte to zero checksum
		inc	ah
		mov	si, (offset MsPciIrqTbl)+31;checksum location
		mov	[si], ah		;save checksum value

		F000_CALL F000_Shadow_R

ENDIF	;MSIRQROUT_SUPPORT

		ret

Build_MsPciIrq	endp

IF	RELEASE_E000_FOR_PCI
		Public	E000_USED_BY_PCI
E000_USED_BY_PCI	db	0
ENDIF	;RELEASE_E000_FOR_PCI

;R82 ifdef	CT_SHADOW_RW_HOOK_SUPPORT
;[]==============================================================[]
;Shadow_C8_To_DF_R:
;	Force all shadow to read only after all PCI ROM done
;Input:		none
;Output:	none
;[]==============================================================[]
		ALIGN	4
Shadow_C8_To_DF_R:
;R82 - starts
ifdef	SHADOW_UNIT_64K
	ifdef	USB_SUPPORT
		test	dword ptr LMEM_RESERVED[bp], 00FFFF00h	;reserved by others?
		jnz	@F
	endif	;USB_SUPPORT
		pushad
		mov	dx, 0D000h
		F000_CALL Ct_Shadow_R
		popad
	@@:
		ret

else	;SHADOW_UNIT_64K
;R82 - starts
		pushad
		F000_CALL Ct_Shadow_Unit		;shadow unit in CX
		mov	dx, 0C800h			;start segment
		mov	bx, cx				;size in byte
		shr	bx, 4				;convert to segment
		mov	eax, 0000000Fh			;mask value
		mov	cl, 4				;shift value
		cmp	bx, 400h			;size in 16KB?
		je	Shadow_C8_To_DF_R_Loop
		mov	eax, 000000FFh			;mask value
		mov	cl,  8				;shift value

Shadow_C8_To_DF_R_Loop:

		test	LMEM_RESERVED[bp], eax		;reserved by others?
		jnz	Shadow_C8_To_DF_R_Next

		pushad
		F000_CALL Ct_Shadow_R
		popad

Shadow_C8_To_DF_R_Next:

		shl	eax, cl
		add	dx, bx
		test	eax, 0FF000000h			;E000 arrived?
		jz	Shadow_C8_To_DF_R_Loop

		popad
		ret
endif	;SHADOW_UNIT_64K			;R82
;R82 endif	;USB_SUPPORT

;-------------------------------------------------------------------------
;-------------------------------------------------------------------------
		ALIGN	4
Shadow_C8_To_DF	Proc	Near
;R82 - starts
ifdef	SHADOW_UNIT_64K

		cmp	byte ptr LMEM_BEFORE_ROM[bp], 0FFh		;R90
		je	@F						;R90
		F000_call C000_Shadow_RW
	@@:								;R90

	ifdef	USB_SUPPORT
		test	dword ptr LMEM_RESERVED[bp], 00FFFF00h
		jnz	@F
	endif	;USB_SUPPORT

		mov	si, 0D000h
		mov	di, TEMP_MEM
		mov	al, 1
		mov	cx, 16
		pusha
		call	ECopy_ROM
		mov	dx, 0D000h
		F000_call Ct_Shadow_RW
		popa

		xchg	si, di
		call	ECopy_ROM
	@@:
		ret

else	;SHADOW_UNIT_64K
;R82 - ends
		mov	si, 0C800h
;717;		mov	di, TEMP_AREA
		mov	di, TEMP_Mem	;;;;;717;

		call	GG

ifndef	USB_SUPPORT
		F000_CALL Ct_C8_To_DF_RW
endif	;USB_SUPPORT

;717;		mov	si, TEMP_AREA
		mov	si, TEMP_Mem	;;;;;717;

		mov	di, 0C800h

ifdef	USB_SUPPORT

		F000_CALL Ct_Shadow_Unit		;shadow unit in CX
		mov	bx, cx				;size in byte
		shr	bx, 4				;convert to segment
		mov	al, 1				;flag for Copy_ROM
		mov	edx, 0000000Fh			;mask value
		mov	cx, 4				;size 4KB*4=16KB
		cmp	bx, 400h			;size in 16KB?
		je	Shadow_C8_To_DF_Loop
		mov	edx, 000000FFh			;mask value
		mov	cx,  8				;size 8KB*4=32KB

	Shadow_C8_To_DF_Loop:

		test	LMEM_RESERVED[bp], edx		;reserved by others?
		jnz	Shadow_C8_To_DF_Next

		pushad
		mov	dx, di				;DX=seg to R/W shadow
		F000_CALL Ct_Shadow_RW
		popad

		pushad
		call	ECopy_ROM
		popad

	Shadow_C8_To_DF_Next:

		add	si, bx				;next source segment
		add	di, bx				;next dest. segment
		s

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -