www.pudn.com > hpbios.rar > AMD29F.NVM
; []===========================================================[] ; ; NOTICE: THIS PROGRAM BELONGS TO AWARD SOFTWARE INTERNATIONAL(R) ; INC. IT IS CONSIDERED A TRADE SECRET AND IS NOT TO BE ; DIVULGED OR USED BY PARTIES WHO HAVE NOT RECEIVED ; WRITTEN AUTHORIZATION FROM THE OWNER. ; ; []===========================================================[] ; ;---------------------------------------------------------------------------- ;Rev Date Name Description ;---------------------------------------------------------------------------- ;R04 02/01/00 BAR Added define post flash write use XDGROUP ;R03 07/20/99 BAR Support use SMI update flash ROM . ; Move all RXX . ;R02 11/30/98 BAR Update ESCD DMI use SMM mode. ; define switch "Flash_IN_SMBASE" ;R01 12/05/96 AVN Suppost Auto Detect EEPROM ID at POST 6 For 1M EEPROM ;**************************************************************** ;* * ;* SUBROUTINES TO SUPPORT AMD 12V FLASH ROM * ;* * ;**************************************************************** ifndef Flash_IN_SMBASE ;[]========================================================================[] ; AMD29F_Flash_Erase : ; ; Erase AMD29F010 PARAMETER BLOCK (F8000h - FBFFFh) ; ;Saves : None ;Input : None ; ;Output: CF = 0 , Successful ; CF = 1 , Error Erase ; ;[]========================================================================[] Public AMD29F_Flash_Erase AMD29F_Flash_Erase Proc Near ifNdef POST_FLASH_IN_XGROUP ;R04 push di mov di, 5555h ; es:di = 15555 mov al, 0AAh ; 1st byte [15555] = AAh ifndef AUTO_DETECT_EEPROM_ID call Ct_Set_Flash else; AUTO_DETECT_EEPROM_ID mov dx,offset Ct_Set_Flash call dx endif; AUTO_DETECT_EEPROM_ID mov di, 2AAAh ; ds:si = 02AAA mov al, 055h ; 2nd byte [02AAA] = 55h ifndef AUTO_DETECT_EEPROM_ID call Ct_Set_Flash else; AUTO_DETECT_EEPROM_ID mov dx,offset Ct_Set_Flash call dx endif; AUTO_DETECT_EEPROM_ID mov di, 5555h ; es:di = 15555 mov al, 80h ; 3rd byte [15555] = 80h ifndef AUTO_DETECT_EEPROM_ID call Ct_Set_Flash else; AUTO_DETECT_EEPROM_ID mov dx,offset Ct_Set_Flash call dx endif; AUTO_DETECT_EEPROM_ID mov di, 5555h ; es:di = 15555 mov al, 0AAh ; 4th byte [15555] = AA ifndef AUTO_DETECT_EEPROM_ID call Ct_Set_Flash else; AUTO_DETECT_EEPROM_ID mov dx,offset Ct_Set_Flash call dx endif; AUTO_DETECT_EEPROM_ID mov di, 2AAAh ; ds:si = 02AAA mov al, 055h ; 5th byte [02AAA] = 55 ifndef AUTO_DETECT_EEPROM_ID call Ct_Set_Flash else; AUTO_DETECT_EEPROM_ID mov dx,offset Ct_Set_Flash call dx endif; AUTO_DETECT_EEPROM_ID pop di mov al, 30h ; 6th byte [15555] = 30 ifndef AUTO_DETECT_EEPROM_ID call Ct_Set_Flash call Wait_10ms ; wait 10 ms until tww expires else; AUTO_DETECT_EEPROM_ID mov dx,offset Ct_Set_Flash call dx mov dx,offset EEPROM_Wait_10ms call dx endif; AUTO_DETECT_EEPROM_ID pusha ifndef AUTO_DETECT_EEPROM_ID call Ct_Get_Flash else; AUTO_DETECT_EEPROM_ID mov dx,offset Ct_Get_Flash call dx endif; AUTO_DETECT_EEPROM_ID mov bh,al ;R04 - starts else; POST_FLASH_IN_XGROUP pusha mov byte ptr gs:[05555h],0aah ; mov byte ptr gs:[02aaah],055h ;SST mov byte ptr gs:[05555h],080h ;page erase mov byte ptr gs:[05555h],0aah ;command mov byte ptr gs:[02aaah],055h ; mov byte ptr es:[di],030h ; push cx ifdef More_Flash_Wait_Time mov cx,350*2 else; More_Flash_Wait_Time mov cx,350 endif; More_Flash_Wait_Time call dx pop cx pusha mov bh, byte ptr es:[di] endif; POST_FLASH_IN_XGROUP ;R04 - ends AMD29F_Erase_Verify: ifNdef POST_FLASH_IN_XGROUP ;R04 ifndef AUTO_DETECT_EEPROM_ID call Ct_Get_Flash else; AUTO_DETECT_EEPROM_ID mov dx,offset Ct_Get_Flash call dx endif; AUTO_DETECT_EEPROM_ID else; POST_FLASH_IN_XGROUP ;R04 mov al, byte ptr es:[di] ;R04 endif; POST_FLASH_IN_XGROUP ;R04 mov bl,bh xor bh,al test bh,40h mov bh,al jz short AMD29F_Erase_OK test bl,20h jz short AMD29F_Erase_Verify ifNdef POST_FLASH_IN_XGROUP ;R04 ifndef AUTO_DETECT_EEPROM_ID call Ct_Get_Flash else; AUTO_DETECT_EEPROM_ID mov dx,offset Ct_Get_Flash call dx endif; AUTO_DETECT_EEPROM_ID else; POST_FLASH_IN_XGROUP ;R04 mov al, byte ptr es:[di] ;R04 endif; POST_FLASH_IN_XGROUP ;R04 xor bl,al test bl,40h jz short AMD29F_Erase_OK stc popa ret AMD29F_Erase_OK: clc popa ret AMD29F_Flash_Erase Endp ;[]====================================================================[] ; AMD29F_Flash_Write : ; ; Program AMD29F010 PARAMETER BLOCK ; ;Saves : ;Input : Source = DS : SI ; Target = ES : DI (Range = F8000h-FBFFFh) ; Length = CX ; ;Output: CF = 0 Successful ; CF = 1 Error Program ; ;[]====================================================================[] public AMD29F_Flash_Write AMD29F_Flash_Write Proc Near pusha AMD29F_Prg_Next_Byte: mov bx,25 ;Program Retry Count mov al,ds:[si] ;Read Data AMD29F_Verify_Retry: call AMD29F_Prg_Sequence ifNdef POST_FLASH_IN_XGROUP ;R04 ifndef AUTO_DETECT_EEPROM_ID call Ct_Set_Flash else; AUTO_DETECT_EEPROM_ID mov dx,offset Ct_Set_Flash call dx endif; AUTO_DETECT_EEPROM_ID else; POST_FLASH_IN_XGROUP ;R04 mov byte ptr es:[di], al ;R04 endif; POST_FLASH_IN_XGROUP ;R04 call AMD29F_Check_Toggle_Ready jc short AMD29F_Verify_Retry ;; Make Sure Program Correct ifNdef POST_FLASH_IN_XGROUP ;R04 ifndef AUTO_DETECT_EEPROM_ID call Ct_Get_Flash else; AUTO_DETECT_EEPROM_ID mov dx,offset Ct_Get_Flash call dx endif; AUTO_DETECT_EEPROM_ID else; POST_FLASH_IN_XGROUP ;R04 mov al, byte ptr es:[di] ;R04 endif; POST_FLASH_IN_XGROUP ;R04 cmp al,ds:[si] je short AMD29F_Verify_OK dec bx jnz short AMD29F_Verify_Retry stc ;Set Program Fail jmp short AMD29F_Prog_Exit AMD29F_Verify_OK: inc si inc di loop AMD29F_Prg_Next_Byte clc AMD29F_Prog_Exit: popa ret AMD29F_Flash_Write Endp AMD29F_Prg_Sequence proc near ifNdef POST_FLASH_IN_XGROUP ;R04 push di push ax mov di,5555h mov al,0aah ifndef AUTO_DETECT_EEPROM_ID call Ct_Set_Flash else; AUTO_DETECT_EEPROM_ID mov dx,offset Ct_Set_Flash call dx endif; AUTO_DETECT_EEPROM_ID mov di,2aaah mov al,55h ifndef AUTO_DETECT_EEPROM_ID call Ct_Set_Flash else; AUTO_DETECT_EEPROM_ID mov dx,offset Ct_Set_Flash call dx endif; AUTO_DETECT_EEPROM_ID mov di,5555h mov al,0a0h ifndef AUTO_DETECT_EEPROM_ID call Ct_Set_Flash else; AUTO_DETECT_EEPROM_ID mov dx,offset Ct_Set_Flash call dx endif; AUTO_DETECT_EEPROM_ID pop ax pop di else; POST_FLASH_IN_XGROUP ;R04 mov byte ptr gs:[05555h],0aah ;R04 mov byte ptr gs:[02aaah],055h ;R04 mov byte ptr gs:[05555h],0a0h ;R04 endif; POST_FLASH_IN_XGROUP ;R04 ret AMD29F_Prg_Sequence endp AMD29F_Check_Toggle_Ready proc near ifNdef POST_FLASH_IN_XGROUP ;R04 clc push ax push bx AMD29F_CTR_TOG1: ifndef AUTO_DETECT_EEPROM_ID call Ct_Get_Flash else; AUTO_DETECT_EEPROM_ID mov dx,offset Ct_Get_Flash call dx endif; AUTO_DETECT_EEPROM_ID mov ah,ds:[si] ;Read Source Bit once and ax,8080h cmp al,ah je short AMD29F_CTR_TOG3 AMD29F_CTR_TOG2: mov bl,ah ifndef AUTO_DETECT_EEPROM_ID call Ct_Get_Flash else; AUTO_DETECT_EEPROM_ID mov dx,offset Ct_Get_Flash call dx endif; AUTO_DETECT_EEPROM_ID and al,0a0h test al,20h jz short AMD29F_CTR_TOG1 and al,80h cmp al,bl je short AMD29F_CTR_TOG3 stc AMD29F_CTR_TOG3: pop bx pop ax ret ;R04 - starts else; POST_FLASH_IN_XGROUP Toggle_Bit = 01000000b push cx push bx mov ah, byte ptr es:[di] mov bx,1000 Ststus_Read_Loop: xor cx,cx Ststus_Read_Loop_1: mov al, byte ptr es:[di] xor ah,al test ah,Toggle_Bit jz short Toggle_End mov ah,al loop Ststus_Read_Loop_1 dec bx jnz Ststus_Read_Loop stc ;Time out pop bx pop cx ret Toggle_End: clc ;Toggle end pop bx pop cx ret endif; POST_FLASH_IN_XGROUP ;R04 - ends AMD29F_Check_Toggle_Ready endp else; Flash_IN_SMBASE ;[]========================================================================[] ; AMD29F_Flash_Erase : ; ; Erase AMD29F010 PARAMETER BLOCK (F8000h - FBFFFh) ; ;Saves : None ;Input : None ; ;Output: CF = 0 , Successful ; CF = 1 , Error Erase ; ;[]========================================================================[] Public AMD29F_Flash_Erase AMD29F_Flash_Erase Proc Near push esi push edi mov esi,0FFFF5555H mov edi,0FFFF2AAAH mov byte ptr es:[esi],0AAh mov byte ptr es:[edi],055h mov byte ptr es:[esi],080h mov byte ptr es:[esi],0AAh mov byte ptr es:[edi],055h pop edi pop esi mov byte ptr es:[edi],30h push cx mov cx,350 ;delay call dx pop cx pusha mov al,es:[edi] mov bh,al AMD29F_Erase_Verify: mov al,es:[edi] mov bl,bh xor bh,al test bh,40h mov bh,al jz short AMD29F_Erase_OK test bl,20h jz short AMD29F_Erase_Verify mov al,es:[edi] xor bl,al test bl,40h jz short AMD29F_Erase_OK stc popa ret AMD29F_Erase_OK: clc popa ret AMD29F_Flash_Erase Endp ;[]====================================================================[] ; AMD29F_Flash_Write : ; ; Program AMD29F010 PARAMETER BLOCK ; ;Saves : ;Input : Source = DS : SI ; Target = ES : DI (Range = F8000h-FBFFFh) ; Length = CX ; ;Output: CF = 0 Successful ; CF = 1 Error Program ; ;[]====================================================================[] public AMD29F_Flash_Write AMD29F_Flash_Write Proc Near pusha AMD29F_Prg_Next_Byte: mov bx,25 ;Program Retry Count mov al, byte ptr ds:[esi] ;Read Data AMD29F_Verify_Retry: call AMD29F_Prg_Sequence mov byte ptr es:[edi], al call AMD29F_Check_Toggle_Ready jc short AMD29F_Verify_Retry ;; Make Sure Program Correct mov al, byte ptr es:[edi] cmp al, byte ptr ds:[esi] je short AMD29F_Verify_OK dec bx jnz short AMD29F_Verify_Retry stc ;Set Program Fail jmp short AMD29F_Prog_Exit AMD29F_Verify_OK: inc esi inc edi loop AMD29F_Prg_Next_Byte clc AMD29F_Prog_Exit: popa ret AMD29F_Flash_Write Endp AMD29F_Prg_Sequence proc near push esi push edi mov esi,0FFFF5555H mov edi,0FFFF2AAAH mov byte ptr es:[esi],0AAh mov byte ptr es:[edi],055h mov byte ptr es:[esi],0A0h pop edi pop esi ret AMD29F_Prg_Sequence endp AMD29F_Check_Toggle_Ready proc near clc push ax push bx AMD29F_CTR_TOG1: mov al, byte ptr es:[edi] mov ah, byte ptr ds:[esi] ;Read Source Bit once and ax,8080h cmp al,ah je short AMD29F_CTR_TOG3 AMD29F_CTR_TOG2: mov bl,ah mov al, byte ptr es:[edi] and al,0a0h test al,20h jz short AMD29F_CTR_TOG1 and al,80h cmp al,bl je short AMD29F_CTR_TOG3 stc AMD29F_CTR_TOG3: pop bx pop ax ret AMD29F_Check_Toggle_Ready endp endif; Flash_IN_SMBASE ;R02 - end