AMIBIOS8® обеспечивает два механизма изменения содержимого Flash ROM Flash Update и BIOS Recovery. Если в процессе старта загрузочного блока обнаружено несовпадение контрольных сумм BIOS, это приводит к запуску процедуры восстановления (BIOS Recovery) содержимого Flash ROM. Процедура Flash Update используется для обновления BIOS и используется в сеансе операционной системы с привлечением специализированных утилит.
AMIBIOS8® позволяет выбрать устройство, на котором расположен носитель с образом BIOS для процедуры Recovery. По умолчанию в таком качестве используется накопитель на гибких магнитных дисках (FDD), что позволяет инициировать процесс перезаписи Flash ROM в процессе выполнения POST. Для этого в корневую директорию гибкого магнитного диска нужно записать файл BIOS с зарезервированным именем AMIBOOT.ROM и удерживать комбинацию клавиш + с момента старта системной платы до момента обращения BIOS к накопителю FDD. Процесс визуализируется на мониторе в виде прогресс-индикатора, а успешное завершение сопровождается серией из девяти звуковых сигналов.
Зарезервированное имя AMIBOOT.ROM может быть изменено разработчиком платформы по своему усмотрению. Обычно, но совсем не обязательно, оно хранится по смещению 0FFB6h от начала последнего сегмента образа BIOS и на платформах ASUS, например, содержит имя системной платы.
Использование зарезервированной комбинации клавиш позволяет не только восстановить или обновить системный BIOS, но и выполнить установку параметров CMOS по умолчанию (Clear CMOS). Если в процессе перезаписи необходимо также очистить NVRAM, следует пользоваться комбинацией , комбинация клавиш + позволит выполнить обновление BIOS без изменения содержимого CMOS.
[code:1]F000:E7D8 Get_Pressed_Key: ; DATA XREF: F000:off_0_E7D6o
F000:E7D8 in al, 60h ; AT Keyboard controller 8042.
F000:E7DA
F000:E7DA check_CTRL: ; CTRL pressed
F000:E7DA cmp al, 1Dh
F000:E7DC jnz short check_F ; "F" key pressed
F000:E7DE or ah, 16h
F000:E7E1
F000:E7E1 check_F: ; CODE XREF: F000:E7DCj
F000:E7E1 cmp al, 21h ; '!' ; "F" key pressed
F000:E7E3 jnz short check_J ; "J" key
F000:E7E5 or ah, 1
F000:E7E8
F000:E7E8 check_J: ; CODE XREF: F000:E7E3j
F000:E7E8 cmp al, 24h ; '$' ; "J" key
F000:E7EA jnz short check_Home
F000:E7EC or ah, 40h
F000:E7EF
F000:E7EF check_Home: ; CODE XREF: F000:E7EAj
F000:E7EF cmp al, cs:Home
F000:E7F4 jnz short check_PageDown
F000:E7F6 or ah, 8
F000:E7F9
F000:E7F9 check_PageDown: ; CODE XREF: F000:E7F4j
F000:E7F9 cmp al, cs:Page_Down
F000:E7FE jnz short loc_0_E803
F000:E800 or ah, 20h
F000:E803
F000:E803 loc_0_E803: ; CODE XREF: F000:E7FEj
F000:E803 mov bl, ah
F000:E805 mov al, 0F7h ; '
[code:1]F000:5F7D POST_D6:
F000:5F7D mov al, 0D6h
F000:5F7F out 80h, al ; checkpoint
F000:5F81 push 0
F000:5F83 pop es
F000:5F84 assume es:nothing
F000:5F84 push 8000h
F000:5F87 pop ds
F000:5F88 assume ds:nothing
F000:5F88 mov al, ds:_test
F000:5F8B and al, 8
F000:5F8D xor al, 8
F000:5F8F jz loc_F5FAD
F000:5F91 and ds:_test, 11111110b
F000:5F96 call _Test_Proc
F000:5F9B jz loc_F5FAD
F000:5F9D xor al, al
F000:5F9F call sub_F5FB4
F000:5FA2 jz loc_F5FAD
F000:5FA4 mov cx, ds:_loop
F000:5FA8 call _ctrl_home
[/code:1]
По переменной _test определяемся со скан-кодами:
[code:1]F000:FFB6 db 'AMIBOOT ROM',0
F000:FFC2 db 9 dup(0)
F000:FFCB db 0
F000:FFCC _ctrl db 1Dh
F000:FFCD _home db 47h
F000:FFCE _test db 0
F000:FFCF db 0
F000:FFD0 db 0
F000:FFD1 db 0
F000:FFD2 db 12h
F000:FFD3 _loop dw 50h ; Wait for key...
F000:FFD5 _PgDn db 51h
F000:FFD6 _PgUp db 49h
[/code:1]