You are on page 1of 33

;**********************************************************************

; 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

DOWN_SEQUENCE_FROM_FREQ_TO_SPD EQU 1 ;SPD->FREQ ==> FREQ->SPD

ENABLE_SUPPORT_CPU_TEST EQU 1 ;support CPU test program


IFDEF ENABLE_SUPPORT_CPU_TEST
ENABLE_OFFSET_ADJUSET_CPU_TEST EQU 1 ;down frequency
ENDIF; ENABLE_SUPPORT_CPU_TEST

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

DISABLE_SOME_DEVICE_WHEN_AOC EQU 1 ;some devices can't run in over clock


PREVENT_SYSTEM_HOLD EQU 1
;CLOCK_GENERATOR_JITTER_REBOOT EQU 1 ;frequency is not smooth up/down
;POWER_SHUT_DOWN_AFTER_TEST EQU 1 ;supported by South Bridge

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

AUTO_OVER_CLOCK_FLAG EQU AUTO_BACKUP_CMOS_FLAG ;CMOS index address


ELSE; COMBINE_CMOS_RELOADED
AUTO_OVER_CLOCK_FLAG EQU 87h ;CMOS index address
ENDIF; COMBINE_CMOS_RELOADED

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

AUTO_OVER_CLOCK_FIRST EQU 08h ;first time to initial Auto Over Clock


AUTO_OVER_CLOCK_LIMIT EQU 04h ;set to maximum or minimum value
AUTO_OVER_CLOCK_CHECK EQU 02h ;check Auto Over Clock was enabled or not

AUTO_OVER_CLOCK_STATE EQU 0FDh ;CMOS index address


VIRTUAL_KEYIN_BIT EQU 80h ;Virtual Keyin signal
VIRTUAL_KEYIN_ENTRY EQU 20h ;entry Setup Utility
VIRTUAL_KEYIN_RESET EQU 10h ;reset some values

AUTO_OVER_CLOCK_BIT EQU 80h ;Auto Over Clock running signal


AUTO_OVER_CLOCK_FINISHEQU 40h ;Auto Over Clock finish
AUTO_OVER_CLOCK_REBOOTEQU 20h ;check system had reboot or not
AUTO_OVER_CLOCK_REBOOT2 EQU 10h ;check system had reboot or not
AUTO_OVER_CLOCK_MEM_CPU EQU 01h;08h ;test Memory or CPU
AUTO_OVER_CLOCK_TEST EQU 04h ;run test program
AUTO_OVER_CLOCK_SUCCESS EQU 02h ;test success
AUTO_OVER_CLOCK_BREAK EQU 08h;01h ;break key was pressed

AUTO_OVER_CLOCK_STEPS EQU 0ECh ;CMOS index address


AUTO_OVER_CLOCK_STEP EQU 00Fh ;step
AUTO_OVER_CLOCK_RECOVER EQU 0F0h ;recover "Boot Device"

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

AOC_TESTER_WATCHDOG_VAL EQU 0AEh ;CMOS index address

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(' ')>

AUTO_OVER_CLOCK_SEARCHEQU 0BCh ;CMOS index address


AUTO_OVER_CLOCK_COUNT EQU 00Fh ;backup counter

AUTO_OVER_CLOCK_SPD EQU 0BDh ;CMOS index address

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'>

AUTO_OVER_CLOCK_FREQ EQU 0BEh ;CMOS index address

MAX_FREQ_SEARCH_TO_SAVE EQU 5 ;maximum is 5


FREQ_COUNTER_ROM_OFFSET EQU 252
FREQ_REPORT_INDEX_BANKEQU SEEPROM_EXT_START_BANK+10
ENDIF; ENABLE_FREQ_SEARCH_REPORT_MNU

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

;key scan code


K_PU EQU 49h ;Page Up
K_PD EQU 51h ;Page Down
K_U EQU 48h ;Up
K_D EQU 50h ;Down
K_L EQU 4Bh ;Left
K_R EQU 4Dh ;Right
K_E EQU 1Ch ;Enter
K_C EQU 01h ;ESC
K_T EQU 44h ;F10
K_Y EQU 15h ;Yes
K_N EQU 31h ;No
K_DEL EQU 53h ;Delete
K_INSERT EQU 52h ;Insert
BREAK_AOC_KEY EQU K_INSERT

;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

;stack index address


VIRTUAL_KEYIN_TABLE EQU 00h ;WORD
VIRTUAL_KEYIN_INDEX EQU 02h ;WORD
LIST_VALUE_TMP EQU 04h ;BYTE
ITEM_VALUE_TMP EQU 05h ;WORD
ITEM_VALUE_CMP EQU 07h ;WORD
FLOWCHART_CALL_OFFSET EQU 09h ;WORD
FLOWCHART_CALL_OFFSET2EQU 0Bh ;WORD
FLOWCHART_CALL_OFFSET3EQU 0Dh ;WORD

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

CREATE_MENUITEM AOC_Title_Item, PLACE_AOC_GROUP, 0, 15,\


ITEMDISABLE,\
NOCT, AUTO_OVER_CLOCK_FLAG,\
AUTO_OVER_CLOCK_CHECK, AUTO_OVER_CLOCK_CHECK,\
0, 0,\
0, 0,\
Null_String, Null_String, Null_String

CREATE_MENUITEM AutoOverClock_Item, PLACE_AOC_GROUP, 0, 15,\


NORMAL_ITEM+GAP_ITEM,\
NOCT, AUTO_OVER_CLOCK_FLAG,\
AUTO_OVER_CLOCK_FIRST, AUTO_OVER_CLOCK_FIRST,\
0, 0,\
0, 1,\
AutoOverClock_String, DISABLED_STRING, AutoOverClock_Help_String

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

test BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_FIRST


jz SHORT @F
pusha
xor cl,cl
call Read_Memory
Xcall x_CalculateWatchDogTimeAuto
popa
@@:
ret
CalculateLoopTimesAOC ENDP

CalculateWatchDogTimeAOC 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

test BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_FIRST


jz SHORT @F
pusha
Xcall x_CalculateWatchDogTimeUser
popa
@@:
ret
CalculateWatchDogTimeAOC ENDP
ENDIF; ENABLE_TESTER_WATCHDOG_MNU
ENDIF; ENABLE_AOC_DYN00_MNU

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

;calculate loop times


xor ah,ah
mov al,CMOS00[bp+AOC_TESTER_WATCHDOG_VAL]
@@:
div BYTE PTR cs:[di]
or al,al
jnz SHORT checkLimitOfLoopTimes
inc BYTE PTR CMOS00[bp+AOC_TESTER_WATCHDOG]
call x_CalculateWatchDogTimeUser
jmp SHORT @B

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

;get loop times of auto


mov al,cs:[si]

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

x_CalculateWatchDogTimeUser PROC NEAR


mov al,CMOS00[bp+AOC_TESTER_WATCHDOG]
and al,AOC_WATCHDOG_MASK
or al,al
jz SHORT @F
;calculate watchdog time
mov ah,30 ;value * 1 minute
mul ah
cmp al,CMOS00[bp+AOC_TESTER_WATCHDOG_VAL]
je SHORT @F
mov CMOS00[bp+AOC_TESTER_WATCHDOG_VAL],al

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

CREATE_MENUITEM SPD_Report_Item, PLACE_SPD_GROUP, 0, 15,\


NORMAL_ITEM+GAP_ITEM,\
NOCT, AUTO_OVER_CLOCK_SPD,\
AUTO_OVER_CLOCK_COUNT, AUTO_OVER_CLOCK_COUNT,\
0, 0,\
0, MAX_SPD_SEARCH_TO_SAVE+1,\
SPD_Report_String, SPD_Report_List_String, Null_String
ENDIF; ENABLE_OVER_CLOCKING_MODE_MNU

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

LoadReportCounterSPD PROC NEAR


pusha

mov si,OFFSET cLoadCounterSPD


mov al,cs:[si]
or al,al
jnz SHORT dontLoadCounterSPD

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

mov BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_SPD],MAX_SPD_SEARCH_TO_SAVE+1


mov cs:[si],al
or al,al
jz SHORT dontLoadCounterSPD
xor ah,ah
mov CMOS00[bp+AUTO_OVER_CLOCK_SPD],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

dontLoadCounterSPD:
popa
ret

cLoadCounterSPD DB 0
LoadReportCounterSPD ENDP

LoadReportBankSPD PROC NEAR


mov ah,CMOS00[bp+AUTO_OVER_CLOCK_SPD]
mov al,ah
and ah,AUTO_OVER_CLOCK_COUNT
or ah,ah
jz SHORT @F
cmp ah,MAX_SPD_SEARCH_TO_SAVE
ja SHORT @F
shr al,BITS_OF_HALF_BYTE
cmp ah,al
je SHORT @F
pusha
clc
call BackupRestoreItemValue
add ah,SPD_REPORT_INDEX_BANK
mov al,1
EXTRN LoadFromBankToStack:NEAR
Post_Func_Call EGROUP:LoadFromBankToStack

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 si,OFFSET cLoadCounterFreq


mov al,cs:[si]
or al,al
jnz SHORT dontLoadCounterFreq

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

mov BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FREQ],MAX_SPD_SEARCH_TO_SAVE+1


mov cs:[si],al
or al,al
jz SHORT dontLoadCounterFreq
xor ah,ah
mov CMOS00[bp+AUTO_OVER_CLOCK_FREQ],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

dontLoadCounterFreq:
popa
ret

cLoadCounterFreq DB 0
cLoadCounterFreqScrollDB 0
LoadReportCounterFreq ENDP

LoadReportBankFreq PROC NEAR


mov ah,CMOS00[bp+AUTO_OVER_CLOCK_FREQ]
mov al,ah
and ah,AUTO_OVER_CLOCK_COUNT
or ah,ah
jz SHORT exitLoadReportBankFreq
mov cl,MAX_FREQ_SEARCH_TO_SAVE
cmp ah,cl
ja SHORT exitLoadReportBankFreq
shr al,BITS_OF_HALF_BYTE
cmp ah,al
je SHORT exitLoadReportBankFreq
pusha
clc
call BackupRestoreItemValue

;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

xor al,AUTO_OVER_CLOCK_REBOOT ;!Reboot flag


out 73h,al
test al,AUTO_OVER_CLOCK_REBOOT
jnz SHORT dontProcessBootFlag
and al,NOT AUTO_OVER_CLOCK_TEST ;clear Test flag
out 73h,al

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

jmp SHORT endCombainTestProgram


ENDIF; COMBINE_MEMTEST86_TO_ROM

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

;entry setup menu at right post code


cmp cx,ENTRY_SETUP_POST_CODE
jne SHORT exitEntrySetupMenu

;prepare to entry setup menu


mov al,AUTO_OVER_CLOCK_FLAG ;get First flag
out 72h,al
in al,73h
mov ah,al
mov al,AUTO_OVER_CLOCK_STATE
out 72h,al
in al,73h
test ah,AUTO_OVER_CLOCK_FIRST
jz SHORT @F
xor al,al ;clear all flags
or al,AUTO_OVER_CLOCK_BIT;set Bit flag
out 73h,al
@@:
;check some conditions for entry setup menu
test al,AUTO_OVER_CLOCK_BIT
jz SHORT exitEntrySetupMenu
test al,AUTO_OVER_CLOCK_TEST
jnz SHORT @F

;entry setup menu


or al,VIRTUAL_KEYIN_ENTRY OR VIRTUAL_KEYIN_RESET
out 73h,al

IFDEF PREVENT_HOLD_IN_SETUP_UTILITY
test al,AUTO_OVER_CLOCK_FINISH
jnz SHORT dontEnableWatchdog
call EnableSuperIoWatchdogForMenu
dontEnableWatchdog:
ENDIF; PREVENT_HOLD_IN_SETUP_UTILITY

int 09h ;virtual key in


jmp SHORT exitEntrySetupMenu
@@:
;clear Test flag and Reboot flag
and al,NOT (AUTO_OVER_CLOCK_TEST OR AUTO_OVER_CLOCK_REBOOT)
out 73h,al
call ProcessWatchdogs

exitEntrySetupMenu:
ret
EntrySetupMenuByAOC ENDP

ProcessWatchdogs PROC NEAR


pusha

call EnableSouthBridgeWatchdog
clc
call EnableSuperIoWatchdog
call DisableSouthBridgeWatchdog
call DisableClockGenWatchdog
clc
call EnableClockGenWatchdog

popa
ret
ProcessWatchdogs ENDP

PreProcessWatchdogs PROC NEAR


pusha

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

mov al,AUTO_OVER_CLOCK_FLAG ;get First flag


out 72h,al
in al,73h
mov ah,al
mov al,AUTO_OVER_CLOCK_STATE ;get flags
out 72h,al
in al,73h

test al,AUTO_OVER_CLOCK_BIT ;"Auto Over Clock" Enabled?


jz SHORT runNormalFlowchart

;double check CMOS was cleaned or not


test BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_FIRST
jz SHORT @F
or BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_CHECK
@@:
IFDEF CHECKSUM_ERROR_BY_CHECK_FLAG
test BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_CHECK
jnz SHORT @F
or al,AUTO_OVER_CLOCK_BREAK
out 73h,al
@@:
ENDIF; CHECKSUM_ERROR_BY_CHECK_FLAG

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

;clear Reset flag


and al,NOT VIRTUAL_KEYIN_RESET
out 73h,al

;hook int 16h


test al,AUTO_OVER_CLOCK_BREAK
jnz SHORT @F
push dx
push di
push es
xor di,di
mov es,di
mov di,16h*4 ;int 16h interrupt vector
mov dx,es:[di]
mov cs:INT16H_IP_HOOK,dx
mov dx,es:[di+2]
mov cs:INT16H_CS_HOOK,dx
mov dx,cs
mov es:[di+2],dx
mov dx,OFFSET HookForDisplayDelayTime
mov es:[di],dx
pop es
pop di
pop dx
@@:
;reset flowchart entry point
call ResetFlowchartEntryPoint

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

ResetFlowchartEntryPoint PROC NEAR


test ah,AUTO_OVER_CLOCK_FIRST ;first run?
jz SHORT @F
mov di,OFFSET FirstTimeAutoOverClockSet
jmp SHORT runResetFlowchartPoint
@@:
test al,AUTO_OVER_CLOCK_BREAK ;finish auto over clock or break it by user?
jz SHORT @F
mov di,OFFSET FinishAutoOverClock
jmp SHORT runResetFlowchartPoint
@@:
test al,AUTO_OVER_CLOCK_SUCCESS ;test success?
jz SHORT @F
mov di,OFFSET ProcessOverClockSuccess
jmp SHORT runResetFlowchartPoint
@@:
mov di,OFFSET ProcessOverClockFail

runResetFlowchartPoint:
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET],di
ret
ResetFlowchartEntryPoint ENDP

HookForDisplayDelayTime PROC NEAR


push cx

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

FirstTimeAutoOverClockSet PROC NEAR


;clear Step flag
mov al,CMOS00[bp+AUTO_OVER_CLOCK_STEPS]
test ah,AUTO_OVER_CLOCK_CHECK
jnz SHORT @F
xor al,al
@@:
and al,NOT AUTO_OVER_CLOCK_STEP
mov CMOS00[bp+AUTO_OVER_CLOCK_STEPS],al

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

;set "Boot Device"


and BYTE PTR CMOS00[bp+First_Boot_CMOS],NOT 0Fh
ENDIF; ENABLE_SET_FIRST_BOOT_DEVICE

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

test BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+LIST_VALUE_TMP],LAST_TEST


jnz SHORT exitSearchingMode

and al,NOT AUTO_OVER_CLOCK_STEP


inc ah
or al,ah
mov CMOS00[bp+AUTO_OVER_CLOCK_STEPS],al

mov al,K_D ;al=scan code


call VirtualOnceKeyIn
mov di,OFFSET reRunSearchingMode
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET],di
ret
@@:
ENDIF; ENABLE_OVER_CLOCKING_MODE_MNU

xor ah,ah

IFDEF ENABLE_OVER_CLOCKING_MODE_MNU
findItemLimit:
ENDIF; ENABLE_OVER_CLOCKING_MODE_MNU

call CheckEndOfKeyTable

;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 prepareNextStepNumber

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

;clear First flag


and BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],NOT AUTO_OVER_CLOCK_FIRST

;set Limit flag


or BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_LIMIT

PreSetTestFlagAndSaveQuitSetup LABEL NEAR


mov al,AUTO_OVER_CLOCK_STATE
out 72h,al
in al,73h

SetTestFlagAndSaveQuitSetup LABEL NEAR


;clear Success flag
and al,NOT AUTO_OVER_CLOCK_SUCCESS

;set Test flag


or al,AUTO_OVER_CLOCK_TEST
out 73h,al

SaveAndQuitSetupMenu LABEL NEAR


IFDEF PREVENT_CMOSDEFAULT_IN_RUNNING
pusha

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

;"Save & Exit Setup" dialog


mov ah,0EEh
call VirtualKeyInBuffer
ret
FirstTimeAutoOverClockSet ENDP

PreFinishAutoOverClockLABEL NEAR
xor al,al

FinishAutoOverClock LABEL NEAR


IFDEF CHECKSUM_ERROR_BY_CHECK_FLAG
;double check CMOS was cleaned or not
test BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_FIRST
jnz SHORT @F
test BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_CHECK
jnz SHORT @F

;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

;clear all flags


xor al,al
out 73h,al

IFDEF PREVENT_CPU_RUN_ERROR
mov BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_PREVENT],00h
ENDIF; PREVENT_CPU_RUN_ERROR

;finish Auto Over Clock


mov ah,0EFh
call VirtualKeyInBuffer
ret
@@:
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

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

;set next value (use INT 09)


stc
call SetLargeOrSmallValue
call VirtualOnceKeyIn
mov di,OFFSET @F
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET],di
stc
ret
@@:
test BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+LIST_VALUE_TMP],SKIP_AUTO
jz SHORT checkLimitValue
ENDIF; ENABLE_OFFSET_ADJUSET_CPU_TEST

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

;"Load Optimized Defaults"


mov di,OFFSET @F
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET],di
@@:
mov ah,0ECh
call VirtualKeyIn
jnc SHORT @F
ret
@@:
;"Load Optimized Defaults" dialog
mov ah,0EDh
call VirtualKeyInBuffer
mov di,OFFSET @F
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET],di
ret
@@:
jmp SHORT setBreakAndFinishFlag
ENDIF; ENABLE_OVER_CLOCKING_MODE_MNU

SetLargeOrSmallValue PROC NEAR


;Input:
;stc set value
;clc recover value

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

CheckMaxOrMinValue PROC NEAR


;Input:
;clc check
;stc find
;Output:
;ah backup carry flag
;Flags:
;C

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]

;check maximun or minimum value


test BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+LIST_VALUE_TMP],UP_MOVE
jnz SHORT dnMove
sahf
jc SHORT min
jnc SHORT max
dnMove:
sahf
jnc SHORT min
max:
;check is maximum value?
cmp STACK_INDEX_ADDRESS_AOC[bp+ITEM_VALUE_CMP],dx
jb SHORT runMaxOrMinValue
jmp SHORT notMaxOrMinValue
min:
;check is minimum value?
cmp STACK_INDEX_ADDRESS_AOC[bp+ITEM_VALUE_CMP],dx
ja SHORT runMaxOrMinValue

notMaxOrMinValue:
clc
lahf
ret

runMaxOrMinValue:
stc
lahf
clc
ret
CheckMaxOrMinValue ENDP

FindMaxOrMinValue PROC NEAR


mov di,OFFSET @F
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET3],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]
stc
call di
jnc SHORT @F
ret
@@:
sahf
jc SHORT finishFindMaxOrMinValue
clc
call SetLargeOrSmallValue
call VirtualOnceKeyIn
mov di,OFFSET FindMaxOrMinValue
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET3],di
stc
ret

finishFindMaxOrMinValue:
clc
ret
FindMaxOrMinValue ENDP

GetCurtOverClockStep PROC NEAR


;menuitem's path (use INT 09)
mov al,CMOS00[bp+AUTO_OVER_CLOCK_STEPS]
mov ah,al
and ah,AUTO_OVER_CLOCK_STEP
ret
GetCurtOverClockStep ENDP

SetNextOverClockStep PROC NEAR


;next item: Frequency and SPD
mov al,CMOS00[bp+AUTO_OVER_CLOCK_STEPS]
mov ah,al
and ah,AUTO_OVER_CLOCK_STEP
and al,NOT AUTO_OVER_CLOCK_STEP
inc ah
or al,ah
mov CMOS00[bp+AUTO_OVER_CLOCK_STEPS],al
ret
SetNextOverClockStep ENDP

TestNextValueOrNextItem PROC NEAR


mov di,OFFSET @F
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET],di
@@:
call GetCurtOverClockStep
call CheckEndOfKeyTable
jc PreFinishAutoOverClock
call VirtualKeyIn
jnc SHORT @F
ret
@@:
test BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+LIST_VALUE_TMP],FIND_LIMIT
jz SHORT checkLimitValue

;check Limit flag


test BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_LIMIT
jnz SHORT checkLimitValue

;set Limit flag


or BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_LIMIT

;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
@@:
jmp PreSetTestFlagAndSaveQuitSetup

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

test BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+LIST_VALUE_TMP],SKIP_AUTO


jz SHORT checkListValue

;set next value (use INT 09)


stc
call SetLargeOrSmallValue
call VirtualOnceKeyIn
mov di,OFFSET @F
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET],di
stc
ret
@@:
and BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+LIST_VALUE_TMP],NOT SKIP_AUTO
test BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+LIST_VALUE_TMP],HAVE_AUTO
jnz SHORT checkLimitValue

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

;set First flag


or BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_FIRST
jmp SaveAndQuitSetupMenu

PrepareTestNextItem LABEL NEAR


;clear Limit flag
and BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],NOT AUTO_OVER_CLOCK_LIMIT

call SetNextOverClockStep
jmp SaveAndQuitSetupMenu
TestNextValueOrNextItem ENDP

TestNextItemOrFinish PROC NEAR


mov di,OFFSET @F
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET],di
@@:
call GetCurtOverClockStep
call CheckEndOfKeyTable
test BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+LIST_VALUE_TMP],LAST_TEST
IFNDEF ENABLE_SUPPORT_CPU_TEST
jnz PreFinishAutoOverClock
ELSE; ENABLE_SUPPORT_CPU_TEST
jz SHORT @F

;prepare test next item


call SetNextOverClockStep

;set CPU flag


mov al,AUTO_OVER_CLOCK_STATE
out 72h,al
in al,73h
or al,AUTO_OVER_CLOCK_MEM_CPU
jmp SetTestFlagAndSaveQuitSetup
@@:
ENDIF; ENABLE_SUPPORT_CPU_TEST

;prepare test next item


call SetNextOverClockStep

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

;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
@@:
;set Limit flag
or BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_LIMIT
jmp PreSetTestFlagAndSaveQuitSetup
TestNextItemOrFinish ENDP

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

test BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+LIST_VALUE_TMP],SKIP_AUTO


jz PreSetTestFlagAndSaveQuitSetup

;set next value (use INT 09)


stc
call SetLargeOrSmallValue
call VirtualOnceKeyIn
mov di,OFFSET @F
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET],di
stc
ret
@@:
and BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+LIST_VALUE_TMP],NOT SKIP_AUTO
test BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+LIST_VALUE_TMP],HAVE_AUTO
jnz SHORT checkLimitValue

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]

;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
@@:
mov al,K_U ;al=scan code
call VirtualOnceKeyIn
mov di,OFFSET @F
mov STACK_INDEX_ADDRESS_AOC[bp+FLOWCHART_CALL_OFFSET2],di
stc
ret
@@:
mov ah,STACK_INDEX_ADDRESS_AOC[bp+VIRTUAL_KEYIN_INDEX+1]
call CheckEndOfKeyTable
jmp SHORT checkLimitValue
TestNextValueOrForwardItem ENDP

SaveToBank24C64SPD PROC NEAR


;Input:
;ah Bank number of 24C64 (0~15)

pusha

add ah,SPD_REPORT_INDEX_BANK
EXTRN SaveToBankFromStack:NEAR
Post_Func_Call EGROUP:SaveToBankFromStack

popa
ret
SaveToBank24C64SPD ENDP

SaveReportCounterSPD PROC NEAR


pusha

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

SaveReportCounterFreq PROC NEAR


;output:
;ah low byte data (bank used)
;al high byte data (bank base)
;bh

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

ProcessOverClockSuccess PROC NEAR


IFDEF ENABLE_SUPPORT_CPU_TEST
test al,AUTO_OVER_CLOCK_MEM_CPU
jnz PreFinishAutoOverClock
ENDIF; ENABLE_SUPPORT_CPU_TEST

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

ProcessOverClockFail PROC NEAR


IFDEF ENABLE_OVER_CLOCKING_MODE_MNU
test BYTE PTR CMOS00[bp+AUTO_OVER_CLOCK_FLAG],AUTO_OVER_CLOCK_MODE
jz SHORT @F
call TestNextValueOrForwardItem
ret
@@:
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,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]

;check step number is EOT?


cmp al,0FFh
je SHORT endVirtualKeyIn ;detected "EOT", al=FF
inc bx
sub al,ah
jz SHORT matchOverClockStepNumber
@@:
mov al,es:[si][bx]
inc bx
or al,al ;null end?
jnz SHORT @B
jz SHORT reCheckOverClockStepNumber

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

CheckEndOfKeyTable PROC NEAR


;Input:
;ah Over Clock Step Number
;Output:
;Flags:
;C

pusha
clc
call CheckOverClockStepNumber
popa
ret
CheckEndOfKeyTable ENDP

VirtualKeyIn PROC NEAR


;Input:
;ah Over Clock Step Number
;Output:
;none
;Flags:
;C

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]

mov al,es:[si][bx] ;al=scan code


or al,al ;detected "Null End"
jz SHORT @F
int 09h ;virtual key in
inc bx
mov STACK_INDEX_ADDRESS_AOC[bp+VIRTUAL_KEYIN_INDEX],bx
stc ;not finish
popa
ret
@@:
inc si
mov STACK_INDEX_ADDRESS_AOC[bp+VIRTUAL_KEYIN_TABLE],si
mov BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+VIRTUAL_KEYIN_INDEX],00h
clc
popa
ret
VirtualKeyIn ENDP

VirtualKeyInBuffer PROC NEAR


;Input:
;ah Over Clock Step Number
;Output:
;none
;Flags:
;C

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

CheckVirtualKeyInBuffer PROC NEAR


;Input:
;none
;Output:
;none
;Flags:
;C

mov ah,01h
int 16h
jz SHORT @F
stc ;not finish
ret
@@:
clc
ret
CheckVirtualKeyInBuffer ENDP

VirtualRepeatKeyIn PROC NEAR


;Input:
;ah Virtual Key In Counter (1~127)
;al scan code
;Flags:
;C

test BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+VIRTUAL_KEYIN_INDEX],80h


jnz SHORT @F
mov BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+VIRTUAL_KEYIN_INDEX],ah
@@:
and BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+VIRTUAL_KEYIN_INDEX],7Fh
cmp BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+VIRTUAL_KEYIN_INDEX],00h
je SHORT @F
int 09h ;virtual key in
dec BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+VIRTUAL_KEYIN_INDEX]
or BYTE PTR STACK_INDEX_ADDRESS_AOC[bp+VIRTUAL_KEYIN_INDEX],80h
stc ;not finish
ret
@@:
clc
ret
VirtualRepeatKeyIn ENDP

VirtualOnceKeyIn PROC NEAR


;Input:
;al scan code

int 09h ;virtual key in


ret
VirtualOnceKeyIn 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

You might also like