Professional Documents
Culture Documents
; Date: 2004.1.16 *
; File Version: 0.01 *
; *
; Author: Dynamic Tang *
; Company: DFI *
;**********************************************************************
; Files required: ( #: have some CODE or DATA in it.) *
; AOC_DYN00 *
; AOC_Keys.def *
; AOC_Dogs.inc *
; Memtest.inc *
; *
; ?FEATURE.ASM --> BFEATURE.ASM *
; *
; POST_MGR.ASM *
; POSTINT9.ASM *
; SETUP.ASM *
; *
; JUMPLESS.INC *
; CHIPBOOT.ASM *
; CLOCK.GEN --> CLKCNTL.INC *
; *
; E8POST.ASM *
; E0POST.ASM *
; *
; SHOW_ON_GROUP_ADVANCE_AOC EQU 1 *
; (define it to BIOS.CFG and use this name to search) *
; SETUPMNU.ASM *
; CHIPSET.EQU *
; SETUP.ASM *
;**********************************************************************
; Notes: *
; ENABLE_AOC_DYN00 *
; Auto Over Clock main routines. Include: *
; INT 09 entry point and process, flowchat and process, *
; memory tester. *
; ENABLE_AOC_DYN00_MNU *
; Auto Over Clock main menuitem. *
; *
; Buffer of KEYIN_BUF[bp+n] used stutes: *
; n=1~D : AOC_DYN00 *
; *
; Hardware requirement: *
; Watchdog of chipsets. *
; 24C64 SEEPROM. (option) *
; 0~15: CMOS Reloaded *
; 16~31: Auto Over Clocking *
; *
; CBROM /oem1 MemSetup.rom *
; CBROM /oem2 MemTest.rom *
; CBROM /oem3 CPUTEST.rom *
;**********************************************************************
;+-------------------+-------------------+-----------------------+-----------------+-----------------+----------------+
;| Bytes of Recovery | Group of Recovery | Group Counter of Save | Bytes of Backup | Group of Backup | Groups of Save |
;+-------------------+-------------------+-----------------------+-----------------+-----------------+----------------+
;| 1 byte (0~15) | 0~15 byte(s) | High byte (0~15) | Low byte (1~15) | 1~15 byte(s) | 0~15 Group(s) |
;+-------------------+-------------------+-----------------------+-----------------+-----------------+----------------+
;| 0 | 0 byte | 0 | 3 | 3 bytes | 0 Group |
;+-------------------+-------------------+-----------------------+-----------------+-----------------+----------------+
;| x | x byte(s) | x | 3 | 3 bytes | x Group(s) |
;+-------------------+-------------------+-----------------------+-----------------+-----------------+----------------+
IFNDEF AOC00_MENU_ITEM_STRING
AOC00_MENU_ITEM_STRING =0FFh ;BFEATURE.ASM
ENDIF; AOC00_MENU_ITEM_STRING
IFNDEF AOC00_ENTRY_SETUP_MENU
AOC00_ENTRY_SETUP_MENU =0FFh ;POST_MGR.ASM
ENDIF; AOC00_ENTRY_SETUP_MENU
IFNDEF AOC00_PROCESS_VIRTUAL_KEYIN
AOC00_PROCESS_VIRTUAL_KEYIN =0FFh ;POSTINT9.ASM
ENDIF; AOC00_PROCESS_VIRTUAL_KEYIN
IFNDEF AOC00_GET_MENUITEM_VALUE
AOC00_GET_MENUITEM_VALUE =0FFh ;SETUP.ASM
ENDIF; AOC00_GET_MENUITEM_VALUE
IFNDEF AOC00_SETUP_MENU_FLOWCHART
AOC00_SETUP_MENU_FLOWCHART =0FFh ;SETUP.ASM
ENDIF; AOC00_SETUP_MENU_FLOWCHART
IFNDEF AOC00_SETUP_MENU_ROUTINES
AOC00_SETUP_MENU_ROUTINES =0FFh ;SETUP.ASM
ENDIF; AOC00_SETUP_MENU_ROUTINES
IFNDEF AOC00_TEST_FAIL_ROUTINE
AOC00_TEST_FAIL_ROUTINE =0FFh ;JUMPLESS.INC, CHIPBOOT.ASM, CLKCNTL.INC, E8POST.ASM
ENDIF; AOC00_TEST_FAIL_ROUTINE
IFNDEF AOC00_SPD_MENU_ITEM_STRING
AOC00_SPD_MENU_ITEM_STRING =0FFh ;BFEATURE.ASM
ENDIF; AOC00_SPD_MENU_ITEM_STRING
IFNDEF AOC00_INIT_SPD_REPORT_STRING
AOC00_INIT_SPD_REPORT_STRING =0FFh ;SETUP.ASM
ENDIF; AOC00_INIT_SPD_REPORT_STRING
IFNDEF AOC00_SKIP_MEMORY_TESTING
AOC00_SKIP_MEMORY_TESTING =0FFh ;E0POST.ASM
ENDIF; AOC00_SKIP_MEMORY_TESTING
IFNDEF AOC00_DETECT_CMOS_CLEANED
AOC00_DETECT_CMOS_CLEANED =0FFh ;CHIPBOOT.ASM
ENDIF; AOC00_DETECT_CMOS_CLEANED
;{}==========================================================================================={}
;{} Functions
;{}==========================================================================================={}
ENABLE_AOC_DYN00 EQU 1
IFDEF ENABLE_AOC_DYN00
COMPILE_TO_BIOSVIEW_BIN_FILE EQU 1
IFNDEF DISABLE_DEFINE_BY_AOC_TEST
COMBINE_CMOS_RELOADED EQU 1
ENDIF; DISABLE_DEFINE_BY_AOC_TEST
COMBINE_MEMTEST86_TO_ROM EQU 1
IFDEF COMBINE_MEMTEST86_TO_ROM
INSERT_AOC_TEST_TO_MEMTEST EQU 1
ENDIF; COMBINE_MEMTEST86_TO_ROM
ENABLE_AOC_DYN00_MNU EQU 1
IFDEF ENABLE_AOC_DYN00_MNU
ENABLE_DISPLAY_DELAY_TIME_MNU EQU 1
ENABLE_TESTER_LOOP_TIMES_MNU EQU 1
IFNDEF INSERT_AOC_TEST_TO_MEMTEST
ENABLE_TESTER_WATCHDOG_MNU EQU 1
ENDIF; INSERT_AOC_TEST_TO_MEMTEST
IFDEF COMBINE_CMOS_RELOADED
ENABLE_OVER_CLOCKING_MODE_MNU EQU 1 ;need 24C64
IFDEF ENABLE_OVER_CLOCKING_MODE_MNU
ENABLE_FREQ_SEARCH_REPORT_MNU EQU 1 ;need 24C64
ENDIF; ENABLE_OVER_CLOCKING_MODE_MNU
ENDIF; COMBINE_CMOS_RELOADED
ENDIF; ENABLE_AOC_DYN00_MNU
IFDEF COMBINE_CMOS_RELOADED
DISABLE_AUTO_BACKUP_IN_RUNNING EQU 1 ;CMOS Reloaded "Auto Backup" function
PREVENT_CMOSDEFAULT_IN_RUNNING EQU 1 ;need 24C64
IFDEF PREVENT_CMOSDEFAULT_IN_RUNNING
PREVENT_CPU_RUN_ERROR EQU 1 ;some source codes in CHIPBOOT.ASM
ENDIF; PREVENT_CMOSDEFAULT_IN_RUNNING
ENDIF; COMBINE_CMOS_RELOADED
PREVENT_HOLD_IN_SETUP_UTILITY EQU 1
IFDEF PREVENT_HOLD_IN_SETUP_UTILITY
ASSIST_COOL_CPU_BY_SOFTWARE EQU 1
ENDIF; PREVENT_HOLD_IN_SETUP_UTILITY
IFDEF COMBINE_MEMTEST86_TO_ROM
ENABLE_RUN_TESTER_BY_USER_MNU EQU 1 ;run program beside running "AOC"
ELSE; COMBINE_MEMTEST86_TO_ROM
ENABLE_SET_FIRST_BOOT_DEVICE EQU 1 ;load program from boot device
ENDIF; COMBINE_MEMTEST86_TO_ROM
DETECT_CMOS_CLEANED_BY_JUMPER EQU 1
IFNDEF DETECT_CMOS_CLEANED_BY_JUMPER
CHECKSUM_ERROR_BY_CHECK_FLAG EQU 1
ENDIF; DETECT_CMOS_CLEANED_BY_JUMPER
EXTEND_DELAY_CLOCK_GEN_WD EQU 1
;DEBUG_SPD_MODE EQU 1
ENDIF; ENABLE_AOC_DYN00
;{}==========================================================================================={}
;{} Function's paraments
;{}==========================================================================================={}
IFDEF ENABLE_AOC_DYN00
ENTRY_SETUP_POST_CODE EQU 103 ;Ref. POST_CODE
FIRST_TIME_FIRST_SPD EQU 1
IFDEF COMBINE_CMOS_RELOADED
SEEPROM_EXT_START_BANKEQU 16 ;use 24C64
IFNDEF AUTO_BACKUP_CMOS_FLAG
INCLUDE usercmos.inc
ENDIF; AUTO_BACKUP_CMOS_FLAG
IFDEF DOWN_SEQUENCE_FROM_FREQ_TO_SPD
AUTO_OVER_CLOCK_SEQUENEQU 80h ;test sequence from Frequency to SPD
ENDIF; DOWN_SEQUENCE_FROM_FREQ_TO_SPD
IFDEF ENABLE_OVER_CLOCKING_MODE_MNU
AUTO_OVER_CLOCK_MODE EQU 40h ;mode selection
ENDIF; ENABLE_OVER_CLOCKING_MODE_MNU
IFDEF ENABLE_DISPLAY_DELAY_TIME_MNU
AOC_DISPLAY_DELAY_TIMEEQU 0EDh ;CMOS index address
AOC_DISPLAY_DELAY_MASKEQU 07Fh
AOC_DISPLAY_DELAY_MAX EQU 100
ENDIF; ENABLE_DISPLAY_DELAY_TIME_MNU
IFDEF ENABLE_TESTER_LOOP_TIMES_MNU
AOC_TESTER_LOOP_TIMES EQU 0ACh ;CMOS index address
AOC_LOOP_TIMES_MAX EQU 255 ;255 times, 0 is endless loop
ENDIF; ENABLE_TESTER_LOOP_TIMES_MNU
IFDEF ENABLE_TESTER_WATCHDOG_MNU
AOC_TESTER_WATCHDOG EQU 0ADh ;CMOS index address
AOC_WATCHDOG_MASK EQU 00Fh
AOC_WATCHDOG_MASK_MAX EQU 8
BITS_OF_WORD EQU 16
ENDIF; ENABLE_TESTER_WATCHDOG_MNU
IFDEF ENABLE_OVER_CLOCKING_MODE_MNU
AOC_MODE0_ITEMNAME EQU <'Optimize Freq./SPD'>
AOC_MODE0_ENDING_SPACEEQU <0 DUP(' ')>
AOC_MODE1_ITEMNAME EQU <'SPD Scanning'>
AOC_MODE1_ENDING_SPACEEQU <6 DUP(' ')>
MAX_SPD_SEARCH_TO_SAVEEQU 10 ;maximum is 10
SPD_COUNTER_ROM_OFFSETEQU 253
SPD_REPORT_INDEX_BANK EQU SEEPROM_EXT_START_BANK
ITEM_NAME_MAX_LENGTH EQU 26
ENDIF; ENABLE_OVER_CLOCKING_MODE_MNU
IFDEF ENABLE_FREQ_SEARCH_REPORT_MNU
AOC_REPORT_ITEMNAME_EXT EQU <' Report'>
BITS_OF_HALF_BYTE EQU 4
IFNDEF DISABLE_DEFINE_BY_AOC_TEST
STACK_INDEX_ADDRESS_AOC EQU KEYIN_BUF
ENDIF; DISABLE_DEFINE_BY_AOC_TEST
IFDEF PREVENT_CPU_RUN_ERROR
AUTO_OVER_CLOCK_PREVENT EQU 0BFh ;CMOS index address
ENDIF; PREVENT_CPU_RUN_ERROR
;menuitem operation
NON_SCANCODE EQU 80h
SKIP_AUTO EQU 80h
UP_MOVE EQU 40h
DN_MOVE EQU 00h
FIND_LIMIT EQU 20h
MOVE_ONCE EQU 10h
LAST_TEST EQU 08h
HAVE_AUTO EQU 04h
IFNDEF DISABLE_DEFINE_BY_AOC_TEST
AOC00_COMBAIN_MEMTEST86_TO_ROM =0
AOC00_COMBAIN_MEMTEST86_MNU =0
INCLUDE Memtest.inc
ENDIF; DISABLE_DEFINE_BY_AOC_TEST
ENDIF; ENABLE_AOC_DYN00
;{}==========================================================================================={}
;{} MACRO
;{}==========================================================================================={}
IFDEF ENABLE_AOC_DYN00
NEWIODELAY MACRO
out 0ebh,al
ENDM
ENDIF; ENABLE_AOC_DYN00
;{}==========================================================================================={}
;{} Menuitems
;{}==========================================================================================={}
IF AOC00_MENU_ITEM_STRING EQ 0
IFDEF ENABLE_AOC_DYN00_MNU
dw AutoOverClock_Item,OFFSET AutoOverClocking
IFDEF ENABLE_TESTER_WATCHDOG_MNU
dw AOC_LoopTimes_Item,OFFSET CalculateLoopTimesAOC
dw AOC_WatchDog_Item,OFFSET CalculateWatchDogTimeAOC
ENDIF; ENABLE_TESTER_WATCHDOG_MNU
ENDIF; ENABLE_AOC_DYN00_MNU
ENDIF; AOC00_MENU_ITEM_STRING EQ 0
IF AOC00_MENU_ITEM_STRING EQ 1
IFDEF ENABLE_AOC_DYN00_MNU
IFNDEF SHOW_ON_GROUP_ADVANCE_AOC
PLACE_AOC_GROUP EQU GROUP_CLK_VOLTAGE
ELSE; SHOW_ON_GROUP_ADVANCE_AOC
PLACE_AOC_GROUP EQU GROUP_AutoOverClock
ENDIF; SHOW_ON_GROUP_ADVANCE_AOC
IFDEF ENABLE_OVER_CLOCKING_MODE_MNU
CREATE_MENUITEM OverClockMode_Item, PLACE_AOC_GROUP, 0, 15,\
NORMAL_ITEM,\
NOCT, AUTO_OVER_CLOCK_FLAG,\
AUTO_OVER_CLOCK_MODE, AUTO_OVER_CLOCK_MODE,\
0, 0,\
0, 1,\
OverClockMode_String, ModeSelection_String, OverClockMode_Help_String
ENDIF; ENABLE_OVER_CLOCKING_MODE_MNU
IFDEF ENABLE_DISPLAY_DELAY_TIME_MNU
CREATE_MENUITEM AOC_DisplayTime_Item, PLACE_AOC_GROUP, 0, 15,\
NOMODBIN+KEYIN+SHOWNUM+DIGIT3,\
NOCT, AOC_DISPLAY_DELAY_TIME,\
AOC_DISPLAY_DELAY_MASK, AOC_DISPLAY_DELAY_MASK,\
50, 50,\
0, AOC_DISPLAY_DELAY_MAX,\
AOC_DisplayTime_String, Null_String, AOC_DisplayTime_Help_String
ENDIF; ENABLE_DISPLAY_DELAY_TIME_MNU
IFDEF ENABLE_TESTER_LOOP_TIMES_MNU
CREATE_MENUITEM AOC_LoopTimes_Item, PLACE_AOC_GROUP, 0, 15,\
NOMODBIN+KEYIN+SHOWNUM+DIGIT3,\
NOCT, AOC_TESTER_LOOP_TIMES,\
AOC_LOOP_TIMES_MAX, AOC_LOOP_TIMES_MAX,\
0, 0,\
1, AOC_LOOP_TIMES_MAX,\
AOC_LoopTimes_String, Null_String, AOC_LoopTimes_Help_String
ENDIF; ENABLE_TESTER_LOOP_TIMES_MNU
IFDEF ENABLE_TESTER_WATCHDOG_MNU
CREATE_MENUITEM AOC_WatchDog_Item, PLACE_AOC_GROUP, 0, 15,\
NORMAL_ITEM,\
NOCT, AOC_TESTER_WATCHDOG,\
AOC_WATCHDOG_MASK, AOC_WATCHDOG_MASK,\
0, 0,\
0, AOC_WATCHDOG_MASK_MAX,\
AOC_WatchDog_String, AOC_WatchDog_List_String, AOC_WatchDog_Help_String
ENDIF; ENABLE_TESTER_WATCHDOG_MNU
AOC00_COMBAIN_MEMTEST86_MNU =1
INCLUDE Memtest.inc
ENDIF; ENABLE_AOC_DYN00_MNU
ENDIF; AOC00_MENU_ITEM_STRING EQ 1
IF AOC00_MENU_ITEM_STRING EQ 2
IFDEF ENABLE_AOC_DYN00_MNU
CREATE_STRING AutoOverClock_String
db 'Auto Scanning',0
CREATE_STRING AutoOverClock_Help_String
db 'You must select one searching mode after enable it then '
db 'Save and Quit Setup to run.',0
IFDEF ENABLE_OVER_CLOCKING_MODE_MNU
CREATE_STRING OverClockMode_String
db 'Searching mode selection',0
CREATE_STRING ModeSelection_String
db AOC_MODE0_ITEMNAME,AOC_MODE0_ENDING_SPACE,0
db AOC_MODE1_ITEMNAME,AOC_MODE1_ENDING_SPACE,0
CREATE_STRING OverClockMode_Help_String
db "<<",AOC_MODE0_ITEMNAME,">>",' let you set one maximum CPU Clock, '
db 'and find the optimized status below the CPU Clock you set. '
db "<<",AOC_MODE1_ITEMNAME,">>",' will test all SPD combination '
db 'and record 10 highest performance available SPD settings.',0
ENDIF; ENABLE_OVER_CLOCKING_MODE_MNU
IFDEF ENABLE_DISPLAY_DELAY_TIME_MNU
CREATE_STRING AOC_DisplayTime_String
db 'Cursor Move Delay Time',0
CREATE_STRING AOC_DisplayTime_Help_String
db 'You can select delay time of cursor move when Auto Scanning is running.',0
ENDIF; ENABLE_DISPLAY_DELAY_TIME_MNU
IFDEF ENABLE_TESTER_LOOP_TIMES_MNU
CREATE_STRING AOC_LoopTimes_String
db 'Test Loop Times',0
CREATE_STRING AOC_LoopTimes_Help_String
db 'You can select loop times of test the system run after booting.'
db '(0 is endless loop)',0
ENDIF; ENABLE_TESTER_LOOP_TIMES_MNU
IFDEF ENABLE_TESTER_WATCHDOG_MNU
CREATE_STRING AOC_WatchDog_String
db 'Time period before reboot',0
CREATE_STRING AOC_WatchDog_List_String
db 'Auto ',0
db '0.5 hr',0
db '1.0 hr',0
db '1.5 hr',0
db '2.0 hr',0
db '2.5 hr',0
db '3.0 hr',0
db '3.5 hr',0
db '4.0 hr',0
CREATE_STRING AOC_WatchDog_Help_String
db 'You can select length of time longer than the tests will run before reboot.',0
ENDIF; ENABLE_TESTER_WATCHDOG_MNU
AOC00_COMBAIN_MEMTEST86_MNU =2
INCLUDE Memtest.inc
ENDIF; ENABLE_AOC_DYN00_MNU
ENDIF; AOC00_MENU_ITEM_STRING EQ 2
IF AOC00_MENU_ITEM_STRING EQ 3
IFDEF ENABLE_AOC_DYN00_MNU
AutoOverClocking PROC NEAR
IFDEF COMPILE_TO_BIOSVIEW_BIN_FILE
call Skip_If_Not_POST_Call
cmp BYTE PTR CALLTYPE[bp], post_call
jne SHORT @F
ENDIF; COMPILE_TO_BIOSVIEW_BIN_FILE
Xcall x_ProcessAutoOverClocking
xor cx,cx
mov di,OFFSET AutoOverClock_Tbl
call If_CX_Then_Dis
@@:
ret
AutoOverClock_Tbl:
IFDEF ENABLE_OVER_CLOCKING_MODE_MNU
dw OFFSET OverClockMode_Item
ENDIF; ENABLE_OVER_CLOCKING_MODE_MNU
IFDEF ENABLE_DISPLAY_DELAY_TIME_MNU
dw OFFSET AOC_DisplayTime_Item
ENDIF; ENABLE_DISPLAY_DELAY_TIME_MNU
IFDEF ENABLE_TESTER_LOOP_TIMES_MNU
dw OFFSET AOC_LoopTimes_Item
ENDIF; ENABLE_TESTER_LOOP_TIMES_MNU
IFDEF ENABLE_TESTER_WATCHDOG_MNU
dw OFFSET AOC_WatchDog_Item
ENDIF; ENABLE_TESTER_WATCHDOG_MNU
dw -1
AutoOverClocking ENDP
IFDEF ENABLE_TESTER_WATCHDOG_MNU
CalculateLoopTimesAOC PROC NEAR
IFDEF COMPILE_TO_BIOSVIEW_BIN_FILE
call Skip_If_Not_POST_Call
cmp BYTE PTR CALLTYPE[bp], post_call
jne SHORT @F
ENDIF; COMPILE_TO_BIOSVIEW_BIN_FILE
ENDIF; AOC00_MENU_ITEM_STRING EQ 3
IF AOC00_MENU_ITEM_STRING EQ 4
IFDEF ENABLE_AOC_DYN00_MNU
x_ProcessAutoOverClocking PROC NEAR
IFDEF ENABLE_TESTER_LOOP_TIMES_MNU
mov ch,CMOS00[bp+AOC_TESTER_LOOP_TIMES]
or ch,ch
jnz SHORT @F
inc ch
@@:
ENDIF; ENABLE_TESTER_LOOP_TIMES_MNU
mov cl,CMOS00[bp+AUTO_OVER_CLOCK_FLAG]
test cl,AUTO_OVER_CLOCK_FIRST
jnz SHORT @F
mov al,AUTO_OVER_CLOCK_STATE
out 72h,al
in al,73h
test al,AUTO_OVER_CLOCK_BIT
jnz SHORT @F
xor ch,ch
IFDEF DOWN_SEQUENCE_FROM_FREQ_TO_SPD
and cl,NOT AUTO_OVER_CLOCK_SEQUEN
ENDIF; DOWN_SEQUENCE_FROM_FREQ_TO_SPD
IFDEF ENABLE_OVER_CLOCKING_MODE_MNU
and cl,NOT AUTO_OVER_CLOCK_MODE
ENDIF; ENABLE_OVER_CLOCKING_MODE_MNU
IFDEF ENABLE_TESTER_WATCHDOG_MNU
and BYTE PTR CMOS00[bp+AOC_TESTER_WATCHDOG],NOT AOC_WATCHDOG_MASK
ENDIF; ENABLE_TESTER_WATCHDOG_MNU
@@:
mov CMOS00[bp+AUTO_OVER_CLOCK_FLAG],cl
IFDEF ENABLE_TESTER_LOOP_TIMES_MNU
mov CMOS00[bp+AOC_TESTER_LOOP_TIMES],ch
ENDIF; ENABLE_TESTER_LOOP_TIMES_MNU
ret
x_ProcessAutoOverClocking ENDP
IFDEF ENABLE_TESTER_WATCHDOG_MNU
x_CalculateWatchDogTimeAuto PROC NEAR
;memory size
xor cx,cx
@@:
inc cx
sub eax,512*1024 ;memory unit is 512KB
ja SHORT @B
dec cx
;data table
mov si,OFFSET Maximum_Loop_Table
mov di,OFFSET WatchDog_Time_Table
add si,cx
add di,cx
mov al,CMOS00[bp+AOC_TESTER_WATCHDOG]
and al,AOC_WATCHDOG_MASK
or al,al
jz SHORT autoCalculate
autoCalculate:
;auto calculate watchdog time
mov al,cs:[di]
mov ah,CMOS00[bp+AOC_TESTER_LOOP_TIMES]
mul ah
mov CMOS00[bp+AOC_TESTER_WATCHDOG_VAL],al
checkLimitOfLoopTimes:
cmp al,CMOS00[bp+AOC_TESTER_LOOP_TIMES]
jae SHORT @F
mov CMOS00[bp+AOC_TESTER_LOOP_TIMES],al
@@:
xor ah,ah
push ax
F000_Call F000_Shadow_W
pop ax
GoSegToMenuSeg ds ;R14
mov [bx].ItemMax,ax
BackSegToMenuSeg ds ;R14
F000_Call F000_Shadow_R
ret
AOC00_WATCHDOGS =00
INCLUDE AOC_Dogs.inc
x_CalculateWatchDogTimeAuto ENDP
F000_call Display_Whole_item
F000_call Refresh_Menu
@@:
ret
x_CalculateWatchDogTimeUser ENDP
ENDIF; ENABLE_TESTER_WATCHDOG_MNU
ENDIF; ENABLE_AOC_DYN00_MNU
ENDIF; AOC00_MENU_ITEM_STRING EQ 4
AOC00_MENU_ITEM_STRING =0FFh
IF AOC00_SPD_MENU_ITEM_STRING EQ 0
IFDEF ENABLE_AOC_DYN00_MNU
IFDEF ENABLE_OVER_CLOCKING_MODE_MNU
dw SPD_Report_Item,OFFSET Show_SPD_Report
ENDIF; ENABLE_OVER_CLOCKING_MODE_MNU
IFDEF ENABLE_FREQ_SEARCH_REPORT_MNU
dw Freq_Report_Item,OFFSET Show_Freq_Report
ENDIF; ENABLE_FREQ_SEARCH_REPORT_MNU
ENDIF; ENABLE_AOC_DYN00_MNU
ENDIF; AOC00_SPD_MENU_ITEM_STRING EQ 0
IF AOC00_SPD_MENU_ITEM_STRING EQ 1
IFDEF ENABLE_AOC_DYN00_MNU
IFDEF ENABLE_OVER_CLOCKING_MODE_MNU
PLACE_SPD_GROUP EQU GROUP_CFEATURE
IFDEF ENABLE_FREQ_SEARCH_REPORT_MNU
CREATE_MENUITEM Freq_Report_Item, PLACE_SPD_GROUP, 0, 15,\
NORMAL_ITEM,\
NOCT, AUTO_OVER_CLOCK_FREQ,\
AUTO_OVER_CLOCK_COUNT, AUTO_OVER_CLOCK_COUNT,\
0, 0,\
0, MAX_SPD_SEARCH_TO_SAVE+1,\
Freq_Report_String, SPD_Report_List_String, Null_String
ENDIF; ENABLE_FREQ_SEARCH_REPORT_MNU
ENDIF; ENABLE_AOC_DYN00_MNU
ENDIF; AOC00_SPD_MENU_ITEM_STRING EQ 1
IF AOC00_SPD_MENU_ITEM_STRING EQ 2
IFDEF ENABLE_AOC_DYN00_MNU
IFDEF ENABLE_OVER_CLOCKING_MODE_MNU
CREATE_STRING SPD_Report_String
db AOC_MODE1_ITEMNAME,AOC_REPORT_ITEMNAME_EXT,0FFh,0,0,0FFh
CREATE_STRING SPD_Report_List_String
db '=below here= ',0
db 'Available #1 ',0
db 'Available #2 ',0
db 'Available #3 ',0
db 'Available #4 ',0
db 'Available #5 ',0
db 'Available #6 ',0
db 'Available #7 ',0
db 'Available #8 ',0
db 'Available #9 ',0
db 'Available #10',0
db 'No any available',0
ENDIF; ENABLE_OVER_CLOCKING_MODE_MNU
IFDEF ENABLE_FREQ_SEARCH_REPORT_MNU
CREATE_STRING Freq_Report_String
db AOC_MODE0_ITEMNAME,AOC_REPORT_ITEMNAME_EXT,0FFh,0,1,0FFh
ENDIF; ENABLE_FREQ_SEARCH_REPORT_MNU
ENDIF; ENABLE_AOC_DYN00_MNU
ENDIF; AOC00_SPD_MENU_ITEM_STRING EQ 2
IF AOC00_SPD_MENU_ITEM_STRING EQ 3
IFDEF ENABLE_AOC_DYN00_MNU
IFDEF ENABLE_OVER_CLOCKING_MODE_MNU
Show_SPD_Report PROC NEAR
IFDEF COMPILE_TO_BIOSVIEW_BIN_FILE
call Skip_If_Not_POST_Call
cmp BYTE PTR CALLTYPE[bp], post_call
jne SHORT @F
ENDIF; COMPILE_TO_BIOSVIEW_BIN_FILE
Xcall LoadReportCounterSPD
mov cx,MAX_SPD_SEARCH_TO_SAVE+1
mov di,OFFSET SPD_Report_Tbl
call If_CX_Then_Dis
Xcall LoadReportBankSPD
@@:
ret
SPD_Report_Tbl:
dw OFFSET SPD_Report_Item
dw -1
Show_SPD_Report ENDP
ENDIF; ENABLE_OVER_CLOCKING_MODE_MNU
IFDEF ENABLE_FREQ_SEARCH_REPORT_MNU
Show_Freq_Report PROC NEAR
IFDEF COMPILE_TO_BIOSVIEW_BIN_FILE
call Skip_If_Not_POST_Call
cmp BYTE PTR CALLTYPE[bp], post_call
jne SHORT @F
ENDIF; COMPILE_TO_BIOSVIEW_BIN_FILE
Xcall LoadReportCounterFreq
mov cx,MAX_SPD_SEARCH_TO_SAVE+1
mov di,OFFSET Freq_Report_Tbl
call If_CX_Then_Dis
Xcall LoadReportBankFreq
@@:
ret
Freq_Report_Tbl:
dw OFFSET Freq_Report_Item
dw -1
Show_Freq_Report ENDP
ENDIF; ENABLE_FREQ_SEARCH_REPORT_MNU
ENDIF; ENABLE_AOC_DYN00_MNU
ENDIF; AOC00_SPD_MENU_ITEM_STRING EQ 3
IF AOC00_SPD_MENU_ITEM_STRING EQ 4
IFDEF ENABLE_AOC_DYN00_MNU
IFDEF ENABLE_OVER_CLOCKING_MODE_MNU
BackupRestoreItemValuePROC NEAR
;input:
;clc Backup
;stc Restore
push ax
lahf
mov si,OFFSET cItemValueTable
dec si
nextItemValue:
inc si
mov dx,cs:[si]
or dl,dl
jnz SHORT @F
pop ax
ret
@@:
mov di,dx
xor dh,dh
xchg di,dx
inc si
sahf
jc SHORT @F
mov dh,CMOS00[bp+di]
mov cs:[si],dh
jmp SHORT nextItemValue
@@:
mov CMOS00[bp+di],dh
jmp SHORT nextItemValue
cItemValueTable DB AUTO_OVER_CLOCK_SPD,?,AUTO_OVER_CLOCK_FREQ,?,0
BackupRestoreItemValueENDP
mov di,bx
mov bl,SPD_COUNTER_ROM_OFFSET
mov ch,SEEPROM_DEVICE_ADDRESS
xor cl,cl ;cl=first byte
EXTRN Ct_I2CWriteByte:NEAR
push cx
mov al,bl ;al=second byte
Post_Func_Call EGROUP:Ct_I2CWriteByte
pop cx
IFDEF ENABLE_DYN16
EXTRN DelayTimeForSEEPROM:NEAR
Post_Func_Call EGROUP:DelayTimeForSEEPROM
ENDIF; ENABLE_DYN16
EXTRN Ct_I2CReadCurt:NEAR
Post_Func_Call EGROUP:Ct_I2CReadCurt
and al,AUTO_OVER_CLOCK_COUNT
cmp al,MAX_SPD_SEARCH_TO_SAVE
jna SHORT @F
EXTRN Ct_I2CWriteWord:NEAR
xor ah,ah ;ah=data
mov al,bl ;al=second byte
Post_Func_Call EGROUP:Ct_I2CWriteWord
IFDEF ENABLE_DYN16
Post_Func_Call EGROUP:DelayTimeForSEEPROM
ENDIF; ENABLE_DYN16
xor al,al
@@:
mov bx,di
push ax
F000_Call F000_Shadow_W
pop ax
GoSegToMenuSeg ds ;R14
mov [bx].ItemMax,ax
BackSegToMenuSeg ds ;R14
F000_Call F000_Shadow_R
dontLoadCounterSPD:
popa
ret
cLoadCounterSPD DB 0
LoadReportCounterSPD ENDP
IFDEF PREVENT_CPU_RUN_ERROR
mov BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_PREVENT],00h
ENDIF; PREVENT_CPU_RUN_ERROR
stc
call BackupRestoreItemValue
popa
mov al,ah
shl al,BITS_OF_HALF_BYTE
or ah,al
mov CMOS00[bp+AUTO_OVER_CLOCK_SPD],ah
F000_call Display_Whole_item
F000_call Refresh_Menu
@@:
ret
LoadReportBankSPD ENDP
ENDIF; ENABLE_OVER_CLOCKING_MODE_MNU
IFDEF ENABLE_FREQ_SEARCH_REPORT_MNU
LoadReportCounterFreq PROC NEAR
pusha
mov di,bx
mov bl,FREQ_COUNTER_ROM_OFFSET
mov ch,SEEPROM_DEVICE_ADDRESS
xor cl,cl ;cl=first byte
EXTRN Ct_I2CWriteByte:NEAR
push cx
mov al,bl ;al=second byte
Post_Func_Call EGROUP:Ct_I2CWriteByte
pop cx
IFDEF ENABLE_DYN16
EXTRN DelayTimeForSEEPROM:NEAR
Post_Func_Call EGROUP:DelayTimeForSEEPROM
ENDIF; ENABLE_DYN16
push cx
EXTRN Ct_I2CReadCurt:NEAR
Post_Func_Call EGROUP:Ct_I2CReadCurt
pop cx
;scroll
mov cs:cLoadCounterFreqScroll,al
and al,AUTO_OVER_CLOCK_COUNT
cmp al,MAX_FREQ_SEARCH_TO_SAVE
jna SHORT @F
EXTRN Ct_I2CWriteWord:NEAR
xor ah,ah ;ah=data
mov al,bl ;al=second byte
Post_Func_Call EGROUP:Ct_I2CWriteWord
IFDEF ENABLE_DYN16
Post_Func_Call EGROUP:DelayTimeForSEEPROM
ENDIF; ENABLE_DYN16
xor al,al
@@:
mov bx,di
push ax
F000_Call F000_Shadow_W
pop ax
GoSegToMenuSeg ds ;R14
mov [bx].ItemMax,ax
BackSegToMenuSeg ds ;R14
F000_Call F000_Shadow_R
dontLoadCounterFreq:
popa
ret
cLoadCounterFreq DB 0
cLoadCounterFreqScrollDB 0
LoadReportCounterFreq ENDP
;scroll
mov al,cs:cLoadCounterFreqScroll
mov ch,al
and ch,AUTO_OVER_CLOCK_COUNT
cmp ch,cl
jne SHORT @F
shr al,BITS_OF_HALF_BYTE
add al,ah
xor ah,ah
div cl
or ah,ah
jnz SHORT @F
mov ah,cl
@@:
add ah,FREQ_REPORT_INDEX_BANK
mov al,1
Post_Func_Call EGROUP:LoadFromBankToStack
stc
call BackupRestoreItemValue
popa
mov al,ah
shl al,BITS_OF_HALF_BYTE
or ah,al
mov CMOS00[bp+AUTO_OVER_CLOCK_FREQ],ah
F000_call Display_Whole_item
F000_call Refresh_Menu
exitLoadReportBankFreq:
ret
LoadReportBankFreq ENDP
ENDIF; ENABLE_FREQ_SEARCH_REPORT_MNU
ENDIF; ENABLE_AOC_DYN00_MNU
ENDIF; AOC00_SPD_MENU_ITEM_STRING EQ 4
AOC00_SPD_MENU_ITEM_STRING =0FFh
IF AOC00_INIT_SPD_REPORT_STRING EQ 1
IFDEF ENABLE_AOC_DYN00_MNU
IFDEF ENABLE_OVER_CLOCKING_MODE_MNU
pusha
mov cl,ITEM_NAME_MAX_LENGTH+1
@@:
dec cl
jz SHORT exitReportOverClock
mov ax,[si]
inc si
cmp ax,00FFh ;magic number
jne SHORT @B
mov ch,al
mov ax,[si]
inc si
IFDEF ENABLE_FREQ_SEARCH_REPORT_MNU
or ah,ah
jnz SHORT notReportSPD
ENDIF; ENABLE_FREQ_SEARCH_REPORT_MNU
mov ax,[si]
cmp ah,ch
je SHORT initReportSPD
mov ch,ah
mov ah,CMOS00[bp+AUTO_OVER_CLOCK_SPD]
cmp ah,ch
jne SHORT @F
or ah,ah
jz SHORT @F
initReportSPD:
xor ah,ah
mov CMOS00[bp+AUTO_OVER_CLOCK_SPD],ah
@@:
mov [si],ax
IFDEF ENABLE_FREQ_SEARCH_REPORT_MNU
jmp SHORT exitReportOverClock
notReportSPD:
mov ax,[si]
cmp ah,ch
je SHORT initReportFreq
mov ch,ah
mov ah,CMOS00[bp+AUTO_OVER_CLOCK_FREQ]
cmp ah,ch
jne SHORT @F
or ah,ah
jz SHORT @F
initReportFreq:
xor ah,ah
mov CMOS00[bp+AUTO_OVER_CLOCK_FREQ],ah
@@:
mov [si],ax
ENDIF; ENABLE_FREQ_SEARCH_REPORT_MNU
exitReportOverClock:
popa
ENDIF; ENABLE_OVER_CLOCKING_MODE_MNU
ENDIF; ENABLE_AOC_DYN00_MNU
ENDIF; AOC00_INIT_SPD_REPORT_STRING EQ 1
AOC00_INIT_SPD_REPORT_STRING =0FFh
;{}==========================================================================================={}
;{} Porgram and Data
;{}==========================================================================================={}
IF AOC00_DETECT_CMOS_CLEANED EQ 1
IFDEF DETECT_CMOS_CLEANED_BY_JUMPER
mov al,AUTO_OVER_CLOCK_STATE
out 72h,al
xor al,al
out 73h,al
IFDEF PREVENT_CPU_RUN_ERROR
mov al,AUTO_OVER_CLOCK_PREVENT
out 72h,al
xor al,al
out 73h,al
ENDIF; PREVENT_CPU_RUN_ERROR
ENDIF; DETECT_CMOS_CLEANED_BY_JUMPER
ENDIF; AOC00_DETECT_CMOS_CLEANED EQ 1
AOC00_DETECT_CMOS_CLEANED =0FFh
IF AOC00_SKIP_MEMORY_TESTING EQ 1
IFDEF ENABLE_AOC_DYN00
mov al,AUTO_OVER_CLOCK_STATE
out 72h,al
in al,73h
test al,AUTO_OVER_CLOCK_BIT
jnz SHORT vdmm_3 ;Ref. [E0POST.ASM]
ENDIF; ENABLE_AOC_DYN00
ENDIF; AOC00_SKIP_MEMORY_TESTING EQ 1
AOC00_SKIP_MEMORY_TESTING =0FFh
IF AOC00_TEST_FAIL_ROUTINE EQ 1
IFDEF ENABLE_AOC_DYN00
mov ah,al ;backup
mov al,AUTO_OVER_CLOCK_FLAG
out 72h,al
in al,73h
test al,AUTO_OVER_CLOCK_FIRST ;prevent system crash in setup menu
jnz SHORT dontProcessPressIns
mov al,AUTO_OVER_CLOCK_STATE
out 72h,al
in al,73h
test al,AUTO_OVER_CLOCK_BIT
jz SHORT exitProcessPressIns
cmp ah,BREAK_AOC_KEY
jne SHORT exitProcessPressIns
or al,AUTO_OVER_CLOCK_BREAK ;set Break flag
and al,NOT AUTO_OVER_CLOCK_TEST ;clear Test flag
out 73h,al
IFDEF PREVENT_CPU_RUN_ERROR
mov al,AUTO_OVER_CLOCK_PREVENT
out 72h,al
in al,73h
or al,AUTO_OVER_CLOCK_BREAK ;set Break flag
out 73h,al
ENDIF; PREVENT_CPU_RUN_ERROR
dontProcessPressIns:
mov ah,K_DEL
exitProcessPressIns:
mov al,ah ;restore
ENDIF; ENABLE_AOC_DYN00
ENDIF; AOC00_TEST_FAIL_ROUTINE EQ 1
IF AOC00_TEST_FAIL_ROUTINE EQ 2
IFDEF ENABLE_AOC_DYN00
mov ah,al ;backup
mov al,AUTO_OVER_CLOCK_STATE
out 72h,al
in al,73h
test al,AUTO_OVER_CLOCK_BIT
jnz SHORT autoRunning
mov al,AUTO_OVER_CLOCK_FLAG
out 72h,al
in al,73h
test al,AUTO_OVER_CLOCK_FIRST ;prevent system crash in setup menu
jz SHORT dontProcessBootFlag
autoRunning:
AOC00_WATCHDOGS =10
INCLUDE AOC_Dogs.inc
in al,73h
test al,AUTO_OVER_CLOCK_FIRST ;prevent system crash in setup menu
jz SHORT autoRunning1
mov al,AUTO_OVER_CLOCK_STATE
out 72h,al
in al,73h
xor al,AUTO_OVER_CLOCK_REBOOT ;!Reboot flag
out 73h,al
test al,AUTO_OVER_CLOCK_REBOOT
jz SHORT virtualPressIns
jmp SHORT $ ;first time shut down
autoRunning1:
mov al,AUTO_OVER_CLOCK_STATE
out 72h,al
in al,73h
test al,AUTO_OVER_CLOCK_TEST ;prevent system crash in setup menu
IFNDEF POWER_SHUT_DOWN_AFTER_TEST
jz SHORT virtualPressIns
ELSE; POWER_SHUT_DOWN_AFTER_TEST
jz SHORT safeBootFromTestProgram
ENDIF; POWER_SHUT_DOWN_AFTER_TEST
IFDEF CLOCK_GENERATOR_JITTER_REBOOT
test al,AUTO_OVER_CLOCK_REBOOT2
jz SHORT twiceReboot2
xor al,AUTO_OVER_CLOCK_REBOOT ;!Reboot flag
out 73h,al
test al,AUTO_OVER_CLOCK_REBOOT
jz SHORT dontProcessBootFlag
and al,NOT AUTO_OVER_CLOCK_REBOOT2 ;clear Reboot2 flag
twiceReboot2:
ENDIF; CLOCK_GENERATOR_JITTER_REBOOT
IFDEF POWER_SHUT_DOWN_AFTER_TEST
jmp SHORT $
safeBootFromTestProgram:
test al,AUTO_OVER_CLOCK_REBOOT2
jz SHORT virtualPressIns
and al,NOT AUTO_OVER_CLOCK_REBOOT2
out 73h,al
jmp SHORT $
ENDIF; POWER_SHUT_DOWN_AFTER_TEST
virtualPressIns:
mov ah,1 ;Ref. [CHIPBOOT.ASM]
dontProcessBootFlag:
mov al,ah ;restore
ENDIF; ENABLE_AOC_DYN00
ENDIF; AOC00_TEST_FAIL_ROUTINE EQ 2
IF AOC00_TEST_FAIL_ROUTINE EQ 5
IFDEF ENABLE_AOC_DYN00
pushf
mov al,AUTO_OVER_CLOCK_FLAG
out 72h,al
in al,73h
test al,AUTO_OVER_CLOCK_FIRST ;prevent system crash in setup menu
jnz SHORT virtualPressIns
mov al,AUTO_OVER_CLOCK_STATE
out 72h,al
in al,73h
test al,AUTO_OVER_CLOCK_BIT
jz SHORT exitAndRestoreCarryFlag
AOC00_WATCHDOGS =20
INCLUDE AOC_Dogs.inc
in al,73h
test al,AUTO_OVER_CLOCK_TEST ;prevent system crash in setup menu
jz SHORT virtualPressIns
IFDEF CLOCK_GENERATOR_JITTER_REBOOT
xor al,AUTO_OVER_CLOCK_REBOOT2 ;!Reboot2 flag
test al,AUTO_OVER_CLOCK_REBOOT2
jnz SHORT @F
or al,AUTO_OVER_CLOCK_REBOOT ;set Reboot flag
@@:
out 73h,al
ENDIF; CLOCK_GENERATOR_JITTER_REBOOT
AOC00_WATCHDOGS =21
INCLUDE AOC_Dogs.inc
cancleInsKeyPressed:
popf
clc ;Ref. [CLOCK.GEN] Check_Ins_Key
jmp SHORT dontProcessPressIns
virtualPressIns:
popf
stc ;Ref. [CLOCK.GEN] Check_Ins_Key
jmp SHORT dontProcessPressIns
exitAndRestoreCarryFlag:
popf
dontProcessPressIns:
ENDIF; ENABLE_AOC_DYN00
ENDIF; AOC00_TEST_FAIL_ROUTINE EQ 5
IF AOC00_TEST_FAIL_ROUTINE EQ 8
IFDEF ENABLE_AOC_DYN00
IFDEF DISABLE_AUTO_BACKUP_IN_RUNNING
mov al,AUTO_OVER_CLOCK_STATE
out 72h,al
in al,73h
test al,AUTO_OVER_CLOCK_BIT
jnz skipAutoBackupByRunAOC
ENDIF; DISABLE_AUTO_BACKUP_IN_RUNNING
ENDIF; ENABLE_AOC_DYN00
ENDIF; AOC00_TEST_FAIL_ROUTINE EQ 8
IF AOC00_TEST_FAIL_ROUTINE EQ 9
IFDEF ENABLE_AOC_DYN00
IFDEF DISABLE_AUTO_BACKUP_IN_RUNNING
skipAutoBackupByRunAOC:
ENDIF; DISABLE_AUTO_BACKUP_IN_RUNNING
mov al,AUTO_OVER_CLOCK_STATE
out 72h,al
in al,73h
test al,AUTO_OVER_CLOCK_BIT
jz SHORT noRunAutoOverClock
IFDEF COMBINE_MEMTEST86_TO_ROM
runCombainTestProgram:
AOC00_COMBAIN_MEMTEST86_TO_ROM =1
INCLUDE Memtest.inc
noRunAutoOverClock:
IFDEF ENABLE_RUN_TESTER_BY_USER_MNU
mov al,MEMTEST86_MENU_FLAG
out 72h,al
in al,73h
IFNDEF ENABLE_SUPPORT_CPU_TEST
test al,ENABLE_RUN_TESTER_BIT
jnz SHORT runCombainTestProgram
ELSE; ENABLE_SUPPORT_CPU_TEST
test al,ENABLE_RUN_ENABLE_BIT
jz SHORT endCombainTestProgram
mov ah,al
mov al,AUTO_OVER_CLOCK_STATE
out 72h,al
in al,73h
or al,AUTO_OVER_CLOCK_MEM_CPU
test ah,ENABLE_RUN_TESTER_BIT
jnz SHORT @F
xor al,AUTO_OVER_CLOCK_MEM_CPU
@@:
out 73h,al
jmp SHORT runCombainTestProgram
ENDIF; ENABLE_SUPPORT_CPU_TEST
ENDIF; ENABLE_RUN_TESTER_BY_USER_MNU
IFDEF COMBINE_MEMTEST86_TO_ROM
endCombainTestProgram:
ENDIF; COMBINE_MEMTEST86_TO_ROM
ENDIF; ENABLE_AOC_DYN00
ENDIF; AOC00_TEST_FAIL_ROUTINE EQ 9
AOC00_TEST_FAIL_ROUTINE =0FFh
IF AOC00_ENTRY_SETUP_MENUEQ 1
IFDEF ENABLE_AOC_DYN00
call EntrySetupMenuByAOC
ENDIF; ENABLE_AOC_DYN00
ENDIF; AOC00_ENTRY_SETUP_MENUEQ 1
IF AOC00_ENTRY_SETUP_MENUEQ 2
IFDEF ENABLE_AOC_DYN00
EntrySetupMenuByAOC PROC NEAR
call PreProcessWatchdogs
IFDEF PREVENT_HOLD_IN_SETUP_UTILITY
test al,AUTO_OVER_CLOCK_FINISH
jnz SHORT dontEnableWatchdog
call EnableSuperIoWatchdogForMenu
dontEnableWatchdog:
ENDIF; PREVENT_HOLD_IN_SETUP_UTILITY
exitEntrySetupMenu:
ret
EntrySetupMenuByAOC ENDP
call EnableSouthBridgeWatchdog
clc
call EnableSuperIoWatchdog
call DisableSouthBridgeWatchdog
call DisableClockGenWatchdog
clc
call EnableClockGenWatchdog
popa
ret
ProcessWatchdogs ENDP
mov al,AUTO_OVER_CLOCK_STATE
out 72h,al
in al,73h
test al,AUTO_OVER_CLOCK_BIT
jz SHORT exitPreProcess
cmp cx,01h
jne SHORT @F
test al,AUTO_OVER_CLOCK_TEST
jz SHORT safeBootFromTestProgram
IFDEF CLOCK_GENERATOR_JITTER_REBOOT
call DisableClockGenWatchdog
ENDIF; CLOCK_GENERATOR_JITTER_REBOOT
IFDEF PREVENT_SYSTEM_HOLD
call DisableOverVoltageTimer
call EnableOverVoltageTimer
ENDIF; PREVENT_SYSTEM_HOLD
clc
call EnableSuperIoWatchdog
jmp SHORT exitPreProcess
@@:
IFDEF EXTEND_DELAY_CLOCK_GEN_WD
cmp cx,28h
jne SHORT @F
test al,AUTO_OVER_CLOCK_TEST
jz SHORT @F
call ProcessWatchdogs
@@:
ENDIF; EXTEND_DELAY_CLOCK_GEN_WD
cmp cx,96h
jne SHORT @F
or al,AUTO_OVER_CLOCK_REBOOT2
out 73h,al
call EnableSouthBridgeWatchdog
IFDEF ENABLE_TESTER_WATCHDOG_MNU
call EnableSuperIoWatchdog2
ENDIF; ENABLE_TESTER_WATCHDOG_MNU
IFDEF INSERT_AOC_TEST_TO_MEMTEST
clc
call EnableSuperIoWatchdog
ENDIF; INSERT_AOC_TEST_TO_MEMTEST
call DisableSouthBridgeWatchdog
call DisableClockGenWatchdog
IFDEF INSERT_AOC_TEST_TO_MEMTEST
clc
call EnableClockGenWatchdog
ENDIF; INSERT_AOC_TEST_TO_MEMTEST
IFDEF PREVENT_SYSTEM_HOLD
call DisableOverVoltageTimer
ENDIF; PREVENT_SYSTEM_HOLD
@@:
jmp SHORT exitPreProcess
safeBootFromTestProgram:
IFNDEF POWER_SHUT_DOWN_AFTER_TEST
test al,AUTO_OVER_CLOCK_REBOOT2
jz SHORT @F
and al,NOT AUTO_OVER_CLOCK_REBOOT2
out 73h,al
stc
call EnableClockGenWatchdog
stc
call EnableSuperIoWatchdog
call DisableSouthBridgeWatchdog
jmp SHORT $
@@:
ENDIF; POWER_SHUT_DOWN_AFTER_TEST
IFDEF PREVENT_SYSTEM_HOLD
call DisableOverVoltageTimer
ENDIF; PREVENT_SYSTEM_HOLD
exitPreProcess:
popa
ret
PreProcessWatchdogs ENDP
AOC00_WATCHDOGS =30
INCLUDE AOC_Dogs.inc
ENDIF; ENABLE_AOC_DYN00
ENDIF; AOC00_ENTRY_SETUP_MENUEQ 2
AOC00_ENTRY_SETUP_MENU =0FFh
IF AOC00_PROCESS_VIRTUAL_KEYIN EQ 1
IFDEF ENABLE_AOC_DYN00
mov ah,al ;backup scan code
mov al,AUTO_OVER_CLOCK_STATE
out 72h,al
in al,73h
test al,VIRTUAL_KEYIN_BIT
jz SHORT @F
test al,VIRTUAL_KEYIN_ENTRY
xchg al,ah ;restore scan code & backup CMOS value
jz Jump_AKBRD ;virtual key in entry point
xchg al,ah ;restore CMOS value
and al,NOT VIRTUAL_KEYIN_ENTRY
out 73h,al
jmp Setup_Check
@@:
ENDIF; ENABLE_AOC_DYN00
ENDIF; AOC00_PROCESS_VIRTUAL_KEYIN EQ 1
AOC00_PROCESS_VIRTUAL_KEYIN =0FFh
IF AOC00_GET_MENUITEM_VALUE EQ 1
IFDEF ENABLE_AOC_DYN00
mov STACK_INDEX_ADDRESS_AOC[bp+ITEM_VALUE_TMP],dx
ENDIF; ENABLE_AOC_DYN00
ENDIF; AOC00_GET_MENUITEM_VALUE EQ 1
AOC00_GET_MENUITEM_VALUE =0FFh
;{}==========================================================================================={}
;{} Flowchart
;{}==========================================================================================={}
IF AOC00_SETUP_MENU_FLOWCHART EQ 1
IFDEF ENABLE_AOC_DYN00
pusha
IFDEF ASSIST_COOL_CPU_BY_SOFTWARE
INCLUDE AOC_TEMP.inc
ENDIF; ASSIST_COOL_CPU_BY_SOFTWARE
call ResetAutoOverClock
mov di,STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET]
call di
runNormalFlowchart:
popa
jmp skipSetupMenuRoutines
ENDIF; ENABLE_AOC_DYN00
ENDIF; AOC00_SETUP_MENU_FLOWCHART EQ 1
AOC00_SETUP_MENU_FLOWCHART =0FFh
;{}==========================================================================================={}
;{} Routines
;{}==========================================================================================={}
IF AOC00_SETUP_MENU_ROUTINES EQ 1
IFDEF ENABLE_AOC_DYN00
ResetAutoOverClock PROC NEAR
test al,VIRTUAL_KEYIN_RESET
jz SHORT exitResetAutoOverClock
;clear some buffers
push ax
xor ax,ax
mov STACK_INDEX_ADDRESS_AOC[bp+VIRTUAL_KEYIN_TABLE],ax
mov STACK_INDEX_ADDRESS_AOC[bp+VIRTUAL_KEYIN_INDEX],ax
pop ax
IFDEF PREVENT_CMOSDEFAULT_IN_RUNNING
test BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_FIRST
jnz SHORT @F
push ax
mov ah,SEEPROM_EXT_START_BANK
mov al,1
EXTRN LoadFromBankToStack:NEAR
Post_Func_Call EGROUP:LoadFromBankToStack
pop ax
@@:
ENDIF; PREVENT_CMOSDEFAULT_IN_RUNNING
exitResetAutoOverClock:
ret
ResetAutoOverClock ENDP
runResetFlowchartPoint:
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET],di
ret
ResetFlowchartEntryPoint ENDP
IFDEF ENABLE_DISPLAY_DELAY_TIME_MNU
mov ch,CMOS00[bp+AOC_DISPLAY_DELAY_TIME]
ELSE; ENABLE_DISPLAY_DELAY_TIME_MNU
mov ch,100
ENDIF; ENABLE_DISPLAY_DELAY_TIME_MNU
xor cl,cl
or cx,cx
jz SHORT exitDisplayDelayTime
@@:
NEWIODELAY
NEWIODELAY
NEWIODELAY
loop SHORT @B
exitDisplayDelayTime:
pop cx
;far jump
DB 0EAH ;machine code
INT16H_IP_HOOK LABEL WORD
DW 0
INT16H_CS_HOOK LABEL WORD
DW 0
HookForDisplayDelayTime ENDP
IFDEF DOWN_SEQUENCE_FROM_FREQ_TO_SPD
test BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_SEQUEN
jnz SHORT setOverClockConfig
ENDIF; DOWN_SEQUENCE_FROM_FREQ_TO_SPD
IFDEF ENABLE_SET_FIRST_BOOT_DEVICE
mov ah,CMOS00[bp+First_Boot_CMOS]
shl ah,BITS_OF_HALF_BYTE
or CMOS00[bp+AUTO_OVER_CLOCK_STEPS],ah
IFDEF DISABLE_SOME_DEVICE_WHEN_AOC
AOC00_DISABLE_DEVICE =1
INCLUDE AOC_DEV.inc
ENDIF; DISABLE_SOME_DEVICE_WHEN_AOC
IFDEF DOWN_SEQUENCE_FROM_FREQ_TO_SPD
setOverClockConfig:
ENDIF; DOWN_SEQUENCE_FROM_FREQ_TO_SPD
IFNDEF DEBUG_SPD_MODE
mov di,OFFSET @F
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET],di
@@:
;set Over Clock configuration (use INT 09)
mov ah,0A0h
call VirtualKeyIn
jnc SHORT @F
ret
@@:
;find maximum or minimum value
mov di,OFFSET @F
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET],di
mov di,OFFSET FindMaxOrMinValue
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET3],di
@@:
mov di,STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET3]
call di
jnc SHORT @F
ret
@@:
IFDEF ENABLE_OVER_CLOCKING_MODE_MNU
test BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_MODE
jnz SHORT runSearchingMode
ENDIF; ENABLE_OVER_CLOCKING_MODE_MNU
IFDEF DOWN_SEQUENCE_FROM_FREQ_TO_SPD
test BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_SEQUEN
jnz SHORT @F
mov al,K_PD ;al=scan code
call VirtualOnceKeyIn
mov di,OFFSET downFrequencyFirst
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET],di
ret
@@:
ENDIF; DOWN_SEQUENCE_FROM_FREQ_TO_SPD
IFDEF ENABLE_OVER_CLOCKING_MODE_MNU
runSearchingMode:
ENDIF; ENABLE_OVER_CLOCKING_MODE_MNU
mov di,OFFSET @F
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET],di
@@:
mov ah,FIRST_TIME_FIRST_SPD
mov al,K_D ;al=scan code
call VirtualRepeatKeyIn
jnc SHORT @F
ret
@@:
IFDEF ENABLE_OVER_CLOCKING_MODE_MNU
test BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_MODE
jz SHORT @F
reRunSearchingMode:
mov al,CMOS00[bp+AUTO_OVER_CLOCK_STEPS]
mov ah,al
and ah,AUTO_OVER_CLOCK_STEP
jmp SHORT findItemLimit
prepareNextStepNumber:
mov al,CMOS00[bp+AUTO_OVER_CLOCK_STEPS]
mov ah,al
and ah,AUTO_OVER_CLOCK_STEP
xor ah,ah
IFDEF ENABLE_OVER_CLOCKING_MODE_MNU
findItemLimit:
ENDIF; ENABLE_OVER_CLOCKING_MODE_MNU
call CheckEndOfKeyTable
exitSearchingMode:
and BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_SEARCH],NOT AUTO_OVER_CLOCK_COUNT
ENDIF; ENABLE_OVER_CLOCKING_MODE_MNU
IFDEF DOWN_SEQUENCE_FROM_FREQ_TO_SPD
downFrequencyFirst:
ENDIF; DOWN_SEQUENCE_FROM_FREQ_TO_SPD
ELSE; DEBUG_SPD_MODE
mov BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_STEPS],3
ENDIF; DEBUG_SPD_MODE
IFDEF PREVENT_CPU_RUN_ERROR
mov CMOS00[bp+AUTO_OVER_CLOCK_PREVENT],al
ENDIF; PREVENT_CPU_RUN_ERROR
mov ah,SEEPROM_EXT_START_BANK
EXTRN SaveToBankFromStack:NEAR
Post_Func_Call EGROUP:SaveToBankFromStack
popa
ENDIF; PREVENT_CMOSDEFAULT_IN_RUNNING
PreFinishAutoOverClockLABEL NEAR
xor al,al
;set Check flag (CMOS was cleaned, but the address "AUTO_OVER_CLOCK_STATE" not zero)
or BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_CHECK
mov al,AUTO_OVER_CLOCK_FINISH
@@:
ENDIF; CHECKSUM_ERROR_BY_CHECK_FLAG
test al,AUTO_OVER_CLOCK_FINISH
jz SHORT @F
IFDEF PREVENT_CPU_RUN_ERROR
mov BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_PREVENT],00h
ENDIF; PREVENT_CPU_RUN_ERROR
IFDEF ENABLE_FREQ_SEARCH_REPORT_MNU
IFDEF ENABLE_OVER_CLOCKING_MODE_MNU
test BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_MODE
jnz SHORT setBreakAndFinishFlag
ENDIF; ENABLE_OVER_CLOCKING_MODE_MNU
test al,AUTO_OVER_CLOCK_BREAK
jnz SHORT setBreakAndFinishFlag
call SaveToBank24C64Freq
ENDIF; ENABLE_FREQ_SEARCH_REPORT_MNU
IFDEF ENABLE_OFFSET_ADJUSET_CPU_TEST
mov di,OFFSET @F
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET],di
@@:
mov ah,STEP_NUMBER_MAX
call VirtualKeyIn
jnc SHORT @F
ret
@@:
checkLimitValue:
;check maximum or minimum value
mov di,OFFSET @F
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET],di
mov di,OFFSET CheckMaxOrMinValue
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET2],di
@@:
mov di,STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET2]
clc
call di
jnc SHORT @F
ret
@@:
sahf
jc SHORT @F
xor BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+LIST_VALUE_TMP],SKIP_AUTO
setBreakAndFinishFlag:
mov al,AUTO_OVER_CLOCK_STATE
out 72h,al
in al,73h
or al,AUTO_OVER_CLOCK_BREAK OR AUTO_OVER_CLOCK_FINISH
out 73h,al
jmp SaveAndQuitSetupMenu
IFDEF ENABLE_OVER_CLOCKING_MODE_MNU
PreFinishAutoOverClockSPD LABEL NEAR
mov ah,CMOS00[bp+AUTO_OVER_CLOCK_SEARCH]
and ah,AUTO_OVER_CLOCK_COUNT
call SaveReportCounterSPD
lahf
mov al,K_PD ;al=scan code
jc SHORT @F
mov al,K_PU ;al=scan code
@@:
test BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+LIST_VALUE_TMP],UP_MOVE
jz SHORT @F
sahf
mov al,K_PU ;al=scan code
jc SHORT @F
mov al,K_PD ;al=scan code
@@:
ret
SetLargeOrSmallValue ENDP
jc SHORT find
stc
jc SHORT @F
find:
clc
@@:
call SetLargeOrSmallValue
call VirtualOnceKeyIn
mov di,OFFSET @F
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET2],di
stc
ret
@@:
mov dx,STACK_INDEX_ADDRESS_AOC[bp+ITEM_VALUE_TMP]
mov STACK_INDEX_ADDRESS_AOC[bp+ITEM_VALUE_CMP],dx
call SetLargeOrSmallValue
call VirtualOnceKeyIn
mov di,OFFSET @F
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET2],di
stc
ret
@@:
lahf
mov dx,STACK_INDEX_ADDRESS_AOC[bp+ITEM_VALUE_TMP]
notMaxOrMinValue:
clc
lahf
ret
runMaxOrMinValue:
stc
lahf
clc
ret
CheckMaxOrMinValue ENDP
finishFindMaxOrMinValue:
clc
ret
FindMaxOrMinValue ENDP
checkLimitValue:
;check maximum or minimum value
mov di,OFFSET @F
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET],di
mov di,OFFSET CheckMaxOrMinValue
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET2],di
@@:
mov di,STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET2]
clc
call di
jnc SHORT @F
ret
@@:
sahf
jc SHORT PrepareTestNextItem
IFDEF DOWN_SEQUENCE_FROM_FREQ_TO_SPD
test BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_SEQUEN
jz PreSetTestFlagAndSaveQuitSetup
ENDIF; DOWN_SEQUENCE_FROM_FREQ_TO_SPD
IFDEF ENABLE_SUPPORT_CPU_TEST
mov al,AUTO_OVER_CLOCK_STATE
out 72h,al
in al,73h
test al,AUTO_OVER_CLOCK_MEM_CPU
jnz SetTestFlagAndSaveQuitSetup
ENDIF; ENABLE_SUPPORT_CPU_TEST
checkListValue:
test BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+LIST_VALUE_TMP],MOVE_ONCE
jz PreSetTestFlagAndSaveQuitSetup
call SetNextOverClockStep
jmp SaveAndQuitSetupMenu
TestNextValueOrNextItem ENDP
mov di,OFFSET @F
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET],di
@@:
call GetCurtOverClockStep
call VirtualKeyIn
jnc SHORT @F
ret
@@:
test BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+LIST_VALUE_TMP],FIND_LIMIT
jz PreSetTestFlagAndSaveQuitSetup
IFDEF ENABLE_OVER_CLOCKING_MODE_MNU
TestNextValueOrForwardItem PROC NEAR
mov di,OFFSET @F
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET],di
@@:
call GetCurtOverClockStep
call CheckEndOfKeyTable
call VirtualKeyIn
jnc SHORT @F
ret
@@:
call GetCurtOverClockStep
mov STACK_INDEX_ADDRESS_AOC[bp+VIRTUAL_KEYIN_INDEX+1],ah
checkLimitValue:
;check maximum or minimum value
mov di,OFFSET @F
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET],di
mov di,OFFSET CheckMaxOrMinValue
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET2],di
@@:
mov di,STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET2]
clc
call di
jnc SHORT @F
ret
@@:
sahf
jc SHORT PrepareTestForwardItem
jmp PreSetTestFlagAndSaveQuitSetup
PrepareTestForwardItemLABEL NEAR
cmp BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+VIRTUAL_KEYIN_INDEX+1],00h
je PreFinishAutoOverClockSPD
dec BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+VIRTUAL_KEYIN_INDEX+1]
pusha
add ah,SPD_REPORT_INDEX_BANK
EXTRN SaveToBankFromStack:NEAR
Post_Func_Call EGROUP:SaveToBankFromStack
popa
ret
SaveToBank24C64SPD ENDP
mov ch,SEEPROM_DEVICE_ADDRESS
xor cl,cl ;cl=first byte
EXTRN Ct_I2CWriteWord:NEAR
;ah=data
mov al,SPD_COUNTER_ROM_OFFSET ;al=second byte
Post_Func_Call EGROUP:Ct_I2CWriteWord
IFDEF ENABLE_DYN16
EXTRN DelayTimeForSEEPROM:NEAR
Post_Func_Call EGROUP:DelayTimeForSEEPROM
ENDIF; ENABLE_DYN16
popa
ret
SaveReportCounterSPD ENDP
IFDEF ENABLE_FREQ_SEARCH_REPORT_MNU
SaveToBank24C64Freq PROC NEAR
pusha
call SaveReportCounterFreq
cmp ah,bh
jne SHORT @F
or al,al
jz SHORT @F
shr al,BITS_OF_HALF_BYTE
mov ah,al
@@:
add ah,FREQ_REPORT_INDEX_BANK
EXTRN SaveToBankFromStack:NEAR
Post_Func_Call EGROUP:SaveToBankFromStack
popa
ret
SaveToBank24C64Freq ENDP
mov bh,MAX_FREQ_SEARCH_TO_SAVE
mov bl,FREQ_COUNTER_ROM_OFFSET
mov ch,SEEPROM_DEVICE_ADDRESS
xor cl,cl ;cl=first byte
EXTRN Ct_I2CWriteByte:NEAR
push cx
mov al,bl ;al=second byte
Post_Func_Call EGROUP:Ct_I2CWriteByte
pop cx
IFDEF ENABLE_DYN16
EXTRN DelayTimeForSEEPROM:NEAR
Post_Func_Call EGROUP:DelayTimeForSEEPROM
ENDIF; ENABLE_DYN16
push cx
EXTRN Ct_I2CReadCurt:NEAR
Post_Func_Call EGROUP:Ct_I2CReadCurt
pop cx
mov ah,al
and ah,AUTO_OVER_CLOCK_COUNT
and al,NOT AUTO_OVER_CLOCK_COUNT
cmp ah,bh
jne SHORT notFullBank
shr al,BITS_OF_HALF_BYTE
cmp al,bh
jne SHORT @F
xor al,al
@@:
inc al
shl al,BITS_OF_HALF_BYTE
dec ah
notFullBank:
inc ah
push ax
EXTRN Ct_I2CWriteWord:NEAR
or ah,al ;ah=data
mov al,bl ;al=second byte
Post_Func_Call EGROUP:Ct_I2CWriteWord
IFDEF ENABLE_DYN16
EXTRN DelayTimeForSEEPROM:NEAR
Post_Func_Call EGROUP:DelayTimeForSEEPROM
ENDIF; ENABLE_DYN16
pop ax
ret
SaveReportCounterFreq ENDP
ENDIF; ENABLE_FREQ_SEARCH_REPORT_MNU
ENDIF; ENABLE_OVER_CLOCKING_MODE_MNU
IFDEF ENABLE_OVER_CLOCKING_MODE_MNU
test BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_MODE
jz SHORT notSearchingModeSPD
IFDEF ENABLE_SET_FIRST_BOOT_DEVICE
;recover "Boot Device"
mov ah,CMOS00[bp+AUTO_OVER_CLOCK_STEPS]
shr ah,BITS_OF_HALF_BYTE
or CMOS00[bp+First_Boot_CMOS],ah
ENDIF; ENABLE_SET_FIRST_BOOT_DEVICE
mov al,CMOS00[bp+AUTO_OVER_CLOCK_SEARCH]
mov ah,al
and ah,AUTO_OVER_CLOCK_COUNT
and al,NOT AUTO_OVER_CLOCK_COUNT
cmp ah,MAX_SPD_SEARCH_TO_SAVE ;maximum
je PreFinishAutoOverClock
inc ah
or al,ah
mov CMOS00[bp+AUTO_OVER_CLOCK_SEARCH],al
call SaveToBank24C64SPD
call SaveReportCounterSPD
IFDEF ENABLE_SET_FIRST_BOOT_DEVICE
;set "Boot Device"
and BYTE PTR CMOS00[bp+First_Boot_CMOS],NOT 0Fh
ENDIF; ENABLE_SET_FIRST_BOOT_DEVICE
call TestNextValueOrForwardItem
ret
notSearchingModeSPD:
ENDIF; ENABLE_OVER_CLOCKING_MODE_MNU
IFDEF DOWN_SEQUENCE_FROM_FREQ_TO_SPD
test BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_SEQUEN
jnz SHORT @F
or BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_SEQUEN
mov di,OFFSET FirstTimeAutoOverClockSet
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET],di
jmp di
@@:
ENDIF; DOWN_SEQUENCE_FROM_FREQ_TO_SPD
call TestNextItemOrFinish
ret
ProcessOverClockSuccess ENDP
IFDEF DOWN_SEQUENCE_FROM_FREQ_TO_SPD
test BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_SEQUEN
jnz SHORT @F
mov al,CMOS00[bp+AUTO_OVER_CLOCK_STEPS]
mov ah,al
and ah,AUTO_OVER_CLOCK_STEP
and al,NOT AUTO_OVER_CLOCK_STEP
cmp ah,STEP_NUMBER_MAX
jae SHORT @F
mov ah,STEP_NUMBER_MAX ;change step number
or al,ah
mov CMOS00[bp+AUTO_OVER_CLOCK_STEPS],al
@@:
ENDIF; DOWN_SEQUENCE_FROM_FREQ_TO_SPD
call TestNextValueOrNextItem
ret
ProcessOverClockFail ENDP
CheckOverClockStepNumber PROC NEAR
;Input:
;ah Over Clock Step Number
;C
;Output:
;bx Table Index
;al EOT or Zero
;Flags:
;C
mov dx,cs
mov si,OFFSET VirtualKeyInItemTable
mov es,dx
jnc SHORT @F
cmp STACK_INDEX_ADDRESS_AOC[bp+VIRTUAL_KEYIN_TABLE],si
je SHORT notFirstTimeVirtualKeyIn
mov STACK_INDEX_ADDRESS_AOC[bp+VIRTUAL_KEYIN_TABLE],si
@@:
xor bx,bx
reCheckOverClockStepNumber:
mov al,es:[si][bx]
matchOverClockStepNumber:
mov al,es:[si][bx]
inc bx
mov STACK_INDEX_ADDRESS_AOC[bp+LIST_VALUE_TMP],al
clc
ret
notFirstTimeVirtualKeyIn:
xor al,al
endVirtualKeyIn:
stc
ret
CheckOverClockStepNumber ENDP
pusha
clc
call CheckOverClockStepNumber
popa
ret
CheckEndOfKeyTable ENDP
pusha
stc
call CheckOverClockStepNumber
jc SHORT @F
mov STACK_INDEX_ADDRESS_AOC[bp+VIRTUAL_KEYIN_INDEX],bx
@@:
mov bx,STACK_INDEX_ADDRESS_AOC[bp+VIRTUAL_KEYIN_INDEX]
pusha
clc
call CheckOverClockStepNumber
@@:
mov es,dx
mov al,es:[si][bx] ;al=scan code
or al,al ;detected "Null End"
jz SHORT @F
int 09h ;virtual key in
inc bx
jmp SHORT @B
@@:
popa
ret
VirtualKeyInBuffer ENDP
mov ah,01h
int 16h
jz SHORT @F
stc ;not finish
ret
@@:
clc
ret
CheckVirtualKeyInBuffer ENDP
VirtualKeyInItemTable LABEL NEAR ;define this table for "Over Clock Items"
INCLUDE AOC_Keys.def
skipSetupMenuRoutines:
ENDIF; ENABLE_AOC_DYN00
ENDIF; AOC00_SETUP_MENU_ROUTINES EQ 1
AOC00_SETUP_MENU_ROUTINES =0FFh