?? pcipost.asm
字號:
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 + -