;	[]===========================================================[]
;
;	NOTICE: THIS PROGRAM BELONGS TO AWARD SOFTWARE INTERNATIONAL(R)
;	        INC. IT IS CONSIDERED A TRADE SECRET AND IS NOT TO BE 	
;	        DIVULGED OR USED BY PARTIES WHO HAVE NOT RECEIVED	
;	        WRITTEN AUTHORIZATION FROM THE OWNER.
;
; 	[]===========================================================[]
;

;----------------------------------------------------------------------------
;Rev	Date	  Name	Description
;----------------------------------------------------------------------------
;R67A	04/23/99  STV	Modify R67 feature for show HDD type stay at AUTO after
;			IDE HDD detect.
;R68	04/23/99  KVN	Fixed system hang when IDE HDD size over 65GB
;R67	04/22/99  STV	Add "Auto_HDD_Detect_IN_STDCMOS" define for stdcmos
;			freature.This feature support auto detect IDE HDD
;			immediately when press 'ENTER' key on Auto type of HDD
;			item.
;R66	04/19/99  RAY	Problem happen on ALLDIN 5(2a5kk/6a5kk)  platform
;
;			  Setting time to 28-FEB-2000, 23:59:58
;			  ---> wait for 2 seconds till 29-FEB-2000
;			  ---> RTC will become 1-MAR-2000
;
;			Solution:
;
;			  Do not inhibit the RTC to update itself when we
;			  try to write the value of time in [BP] back to 
;			  RTC. Add a switch: Dont_Stop_RTC_When_Update_RTC
;			  to patch this bug of ALi's chipset
;
;R65	04/09/99  RIC	Add "SPECIAL_SHARE_MEMORY_SHOW" definition for special
;			customer.
;R64	03/19/99  PAL	Move TV OUT item in IOFEAT.ASM 
;R63	03/12/99  PAL	Added "TV_Out_Not_IN_STDCMOS" option
;R62	03/01/99  PAL	Added "Issue_Gemlight_TV_Out_Function" option
;R61	01/28/99  DRS	This function depends on Not_Change_Setup_Color definition
;			Don't support "Change Color" function in SETUP.
;			Set default SETUP color by CMOS3B[bp] = 03h
;R60	10/20/98  GAR	Fix bug about IDE setup if define No_Support_4_IDE
;R59	09/29/98  RAY	Move code to XGROUP
;R58	09/24/98  RAY	Further reduce code size in F000 by moving the 
;			showing memory size code & menuitem in setup to
;			XGROUP.
;
;R57	09/24/98  RAY	Mask all codes of "Support_Calender_In_Setup" since
;			they are no longer useful for current customer demand.
;			Also, it cannot be sucessfully compiled.
;
;R55A	09/18/98  DRS	Added HaltOn_Item_BIOS_D4_Value and HaltOn_Item_SETUP_D4_Value
;			definition
;R56	08/25/98  KVN	Added show machine and serial string in stdcmos page
;			for USI of OEM
;R55	08/10/98  ADS	Added "NO_Error_For_HaltOn_Item_D4" define.
;R54	07/27/98  KVN	Added a new switch "EVAL_MSG_In_STDCMOS" for display
;			evaluation message in standard page of setup.
;R53	03/19/98  RAX	Fixed lable name conflict with Multi-language support.
;R52A	02/16/98  RAY	Fix mess up of "Available Option" Help when handling
;			new format ?feature.asm but some how not every 
;			MENUITEM's [ITEM].HelpOffset has been changed to point
;			to a string offset in XGROUP
;
;			i.e. Allow you to still point to STD_HELP_STR in
;			     [ITEM].HelpOffset even though that file has
;			     already been claimed to be a new format file.
;
;R52	02/14/98  RAY	Support new ?feature.asm format in which the help
;			offset of each item is pointed to XGROUP.
;
;			This is done to let ?feature.asm works both in BIOS
;			4.51 & 4.60(supports Multi-Languages)
;
;R51	01/13/98 RCH	Change default value as "All,but keyboard" for "halt"
;			checking and also change year default to 1998
;R42A	11/03/97 LAW	Change year default to 1997
;R50	10/27/97 KGN	move defin LCD_CRT_OPTION to common.equ
;R49	07/15/97 RAX	Add Switch support FDD 3.5in only.
;R48	05/26/97 DNL	Add "Support_1_FDD" definition to save more space
;R47	05/20/97 RCH	Modify codes to display memory size up to 1GB
;R46	05/07/97 DRS	Add "Absent" item to process none VGA sitution.
;			It's special for GIANTEC 
;R45	02/24/97 KVN	Change HDD size display digital to 5 for support over
;			10GB HDD
;R44	02/18/97 DNL	Added "TV_OUT_SUPPORT" definition to support VGA TV-out
;			function
;R43	11/15/96 RAY	Move some strings to E000 to save F000 area
;R42	10/15/96 RAY	Change the max. year option to 2079
;R41	10/14/96 DNL	Added no CRT auto detection support
;R40	10/11/96 DNL	Added LCD only model support
;R39	10/04/96 KVN	Added boot HDD selectable function
;R08A	09/26/96 LRY	'Skip_HDD_Type_1_To_46',  removed HD type table
;R38	09/05/96 RAX	Fixed default error
;R37	08/07/96 RAY	Save codes
;R32C	08/02/96 DNL	Change default setting for Notebook Power Management
;R36	05/22/96 KVN	Fixed don't use POST_FUNC_CALL if not in POST (e.g. from
;			MODBIN enter setup) otherwise will cause hang
;R32B	04/11/96 DNL	Added auto-detect display type option
;R32A	03/14/96 DNL	Added CRT&LCD display type option for BIOS
;R35    03/12/96 KVN    Added VGA FEATURE CONNECTOR
;R34	02/10/96 RCH	Change default of Drive A to 3.5" 1.44Mb due to most
;			of PC are using 1.44Mb instead of 1.2Mb
;R33	12/06/95 DNL	Added codes for Support_1_FDD definition
;R32	11/20/95 DNL	Added CRT&LCD display type option for notebook BIOS
;R31	11/03/95 KVN	Added floppy 3 mode 1.2Mb format
;R30	11/01/95 DNL	Added "Ct_FDD_3_MODE" definition to support FDD 3 Mode
;R29	10/16/95 TNY	Add Support_1_FDD definition.
;R28	09/14/95 KVN	Fix cylinder x head > 65536 then HDD size show error
;R16A	09/11/95 KVN	Added FDD 3 mode auto analysis
;R23A	08/03/95 RAY	No_Support_4_IDE should placed after "include bios.cfg"
;R27	07/28/95 DNL	Define "IDE_PRIMARY_ONLY" to support no slave IDE mode
;R26	07/21/95 KVN	Added HDD access AUTO mode
;R24A	07/21/95 KVN	Remove HDD access mode error
;R25	07/19/95 KVN	Open HDD access mode for MODBINable
;R24	07/15/95 KVN	Added HDD access mode error
;R23	06/14/95 KVN	Open Support_4_IDE feature become standard feature
;R22	06/13/95 KVN	Reduce Post_func_call and F000_call code size
;R21	06/09/95 KVN	Open Post_Auto_IDE_Detect feature become standard
;R20	05/17/95 HTR	Add DRIVE A defaule 1.44MB option
;R19	04/19/95 RAY	Public Temp_Year_Item
;R18	04/14/95 BEN	Fixed for standard CMOS setup can not modifiable BIOS
;		 	default in MODBIN.
;R17	03/30/95 AVN	Fixed if FDD 3 Mode Support And POST Fail If Enter
;		 	Stdsetup So Do It in Cfeature.asm
;R16	03/20/95 DNL	Added FDD 3 mode support
;R15	01/26/95 RCH	Change default year to 1995
;R14	11/09/94 KVN	Fixed MSD.EXE utility 'DISK Drives' test error
;R13	10/14/94 KVN	Change HDD size unit to be 1,000,000MB
;R12	10/06/94 RAY	modify position of HDD strings for Low Level Format
;		 	in 4 IDE version
;R11	09/21/94 AVN	Change Show String under SETUP/DOS for 4 IDE Support.
;R10	09/09/94 RCH	Some customer need "AUTO" for hard drive as default
;R09	09/08/94 RAY	Set year item minimum = 1994
;R08	09/08/94 RAY	Add "Skip_HDD_Type_1_To_46" option
;R07	08/26/94 RAY	Fix bug for HDD update if user key in the type
;R06	08/26/94 RAY	Do not load default for RTC
;R05	08/17/94 KVN	Fixed up bug for MODBIN.EXE
;R04	08/17/94 KVN	Added POST auto IDE detect function
;R03	08/15/94 RCH	Re-write routine "Check_Valid_HDD_Type" to support 4
;		 	HDD drives
;R02	06/17/94 RAY	Modify string: "DRIVE C" in case MODBIN will show
;		 	it wrong!
;R00	06/02/94 RAY	Initial Revision for HDD LBA/LARGE mode & 4 IDE

		PAGE	56,132
		.286

IDE_LBA_MODE_SUPPORT	EQU	1
;R23A ifndef	No_Support_4_IDE					;R23
;R23A Support_4_IDE		EQU	1				;R23
;R23A endif	;No_Support_4_IDE					;R23

		include	bios.cfg

ifndef	No_Support_4_IDE					;R23A
Support_4_IDE		EQU	1				;R23A
endif	;No_Support_4_IDE					;R23A

		include	bsetup.inc
		include	common.mac
		include	common.equ
ifdef Auto_HDD_Detect_IN_STDCMOS				;R67
		include cmos.equ				;R67
endif ;Auto_HDD_Detect_IN_STDCMOS				;R67

ifndef No_Post_Auto_IDE_Detect			;R21
Post_Auto_IDE_Detect	equ	1		;R21
HardDrive_AUTO_DEFAULT	equ	1		;R21
endif ;No_Post_Auto_IDE_Detect			;R21

;R49 start
ifdef	Notebook_Power_Management
ifndef	Desktop_System
ifndef	FDD_3_Mode
	FDD_1M44_2M88_ONLY		EQU	1
endif	;FDD_3_Mode
endif;	Desktop_System
endif;	Notebook_Power_Management
;R49 end
ifdef EVAL_MSG_In_STDCMOS			;R54
		extrn	EVAL_MSG:near		;R54
endif ;EVAL_MSG_In_STDCMOS			;R54
		EXTRN	AWARD_TITLE:NEAR
		EXTRN	AX_TO_DEC2:NEAR
		EXTRN	DESTROY_KEY_THEN_RET:NEAR
		EXTRN	DISPLAY_STRING:NEAR
		EXTRN	DISPLAY_WHOLE_ITEM:NEAR
		EXTRN	DISP_ITEMTITLE:NEAR
		EXTRN	DISP_ITEMVAR:NEAR
		EXTRN	DOWN_LINE:NEAR
		EXTRN	GET_ITEMSTAT_AX:NEAR
		EXTRN	GO_MOST_RIGHT_ITEM:NEAR
		EXTRN	HEX_TO_BCD:NEAR
		EXTRN	MOVE_CURSOR:NEAR
		EXTRN	READ_ITEM_VALUE:NEAR
		EXTRN	READ_MEMORY:NEAR
		EXTRN	SEQ_DOWN_BY_MENU_LIST:NEAR
		EXTRN	SEQ_UP_BY_MENU_LIST:NEAR
		EXTRN	SET_CMOS12H:NEAR
		EXTRN	SET_ITEMSTAT_AX:NEAR
		EXTRN	SHOW_SIX_DIGIT:NEAR
		EXTRN	TEST_ITEMSTAT:NEAR
		EXTRN	UP_LINE:NEAR
		EXTRN	VHILITE:NEAR
		EXTRN	VNORMAL:NEAR
		EXTRN	VREVERSE:NEAR
		EXTRN	WRITE_ITEM_VALUE:NEAR
		extrn	Get_Cmos:Near
		extrn	Set_Cmos:Near
		extrn	HDISK_PARMS:near

;R22		extrn	POST_func_end:Near	;128k
;R22		extrn	POST_VECT:Near		;128k
		extrn	Post_call_proc:near	;R22
		extrn	STD_HELP_STR:near	;R52A

ifdef	IDE_LBA_MODE_SUPPORT
		extrn	Tran_CHS_LBA:near
		extrn	Tran_CHS_LARGE:near
endif	;IDE_LBA_MODE_SUPPORT

		extrn	PAGE_NAME_Y:ABS
		extrn	START_Y:ABS
		extrn	BLAX_To_Dec6:near

		extrn	xcall_proc:near				;R59
		extrn	Refresh_Menu1:near			;R59
		extrn	X_Refresh_Menu1:near			;R59
		extrn	X_Display_CS_String:near		;R59
		extrn	X_Display_String:near			;R59
		extrn	X_Display_Char:Near			;R59
		extrn	X_Disp_ItemTitle:Near			;R59
		extrn	X_Write_Item_Value:near			;R59
		extrn	X_VReverse:Near				;R59
		extrn	X_VNormal:near				;R59
		extrn	X_Display_Whole_Item:near		;R59
		extrn	X_Read_Item_Value:near			;R59
		extrn	X_Get_ItemStat_AX:near			;R59
		extrn	X_Set_ItemStat_AX:near			;R59
		extrn	X_Disp_ItemVar:near			;R59
		extrn	X_Move_Cursor:near			;R59
ifdef	SPECIAL_SHARE_MEMORY_SHOW				;R65
		extrn	Ct_Share_Memory_Size:near		;R65
endif	;SPECIAL_SHARE_MEMORY_SHOW				;R65
ifdef Auto_HDD_Detect_IN_STDCMOS				;R67
		extrn	Auto_IDE_Detect_X:near			;R67
endif ;Auto_HDD_Detect_IN_STDCMOS				;R67

		Public	StdCMOS_Special_Do
		Public	StdCMOS_Special_Show
		Public	StdCMOS_Key_List
		Public	StdCMOS_StartUp_Str
		Public	StdCMOS_Start
		Public	StdCMOS_End
		Public	HDDC_ITEM
		Public	HDDD_ITEM
ifdef	Support_4_IDE
		Public	HDDE_ITEM
		Public	HDDF_ITEM
		Public	SNAMEKE		;R11
		Public	SNAMEKF		;R11
endif	;Support_4_IDE
		Public	SECOND_ITEM
		Public	CENTURY_ITEM
		Public	YEAR_ITEM
		Public	TEMP_YEAR_ITEM	;R19
		Public	MONTH_ITEM
		Public	DATE_ITEM
		Public	HOUR_ITEM
		Public	MINUTE_ITEM
		Public	SECOND_ITEM
		public	DayLight_Item
		Public	NULLSTR
;R43		Public	HELP_BORDER
;R52A		Public	STD_HELP_STR
;R43		Public	CLEAR_HELP
		Public	SNAMEKC
		Public	SNAMEKD
;R59		Public	RESHOW_HDD
;R57 ifdef	Support_Calender_In_Setup
;R57 		Public	TOGGLE_CALENDER
;R57 endif	;Support_Calender_In_Setup
;R59		Public	WRITE_TIME_TO_CMOS1
;R59		Public	CHECK_VALID_HDD_TYPE
		Public	Ena_Str
		Public	Dis_Str
;R52A		Public	Std_Help_Str

		Public	Video_Item
		Public	DRIVE_A_ITEM
ifndef	Support_1_FDD				;R48
		Public	DRIVE_B_ITEM
endif	;Support_1_FDD				;R48
;R59		Public	Transfer_Hdd_Parms

		Public	NUM_OF_IDE_ITEM

ifdef	Support_4_IDE
	NUM_OF_IDE_ITEM		EQU	4
	LAST_HDD_TYPE_ITEM	EQU	(offset HDDF_ITEM)
	LAST_HDD_ITEM		EQU	(offset HDDF_ITEM)+HDD_TYPE_DIFF-ITEM_SIZE
else	;Support_4_IDE
	NUM_OF_IDE_ITEM		EQU	2
	LAST_HDD_TYPE_ITEM	EQU	(offset HDDD_ITEM)
	LAST_HDD_ITEM		EQU	(offset HDDD_ITEM)+HDD_TYPE_DIFF-ITEM_SIZE
endif	;Support_4_IDE

HDPARMS 	STRUC
MaxCyl		DW	?			; Maximum cylinder number
MaxHead		DB	?			; Maximum number of heads
		DW	?			; Not used
MaxPreComp	DW	?			; Starting write precomp cylinder
		DB	?			; Not used
		DB	?			; Control byte - bit 3 on for more than 8 heads
		DB	?			; Not used
		DB	?			; Not used
		DB	?			; Not used
MaxLandZone	DW	?			; Landing Zone
MaxSector 	DB	?			; Number of sectors/track
		DB	?			; Not used
HDPARMS		ENDS
HDP_SIZE	EQU	SIZE HDPARMS

DGROUP		GROUP	FCODE
FCODE		SEGMENT	WORD PUBLIC 'CODE'
		ASSUME	CS:DGROUP,DS:DGROUP
;---------------------------------------------------------------------------------------------------------------------------

;-----------------------------------------------------------------------

StdCMOS_Special_Do:
		dw	StdCMOS_Do_NO

ifdef	IDE_LBA_MODE_SUPPORT
		dw	LAST_HDD_ITEM+ITEM_SIZE	    ,offset Move_HDD_Cursor
;R59		dw	Offset HDDC_ITEM+ITEM_SIZE*7,offset Do_LBA
;R59		dw	Offset HDDD_ITEM+ITEM_SIZE*7,offset Do_LBA
;R59	ifdef	Support_4_IDE
;R59		dw	Offset HDDE_ITEM+ITEM_SIZE*7,offset Do_LBA
;R59		dw	Offset HDDF_ITEM+ITEM_SIZE*7,offset Do_LBA
;R59	endif	;Support_4_IDE
endif	;IDE_LBA_MODE_SUPPORT

		dw	offset Year_Item	    ,offset Do_Year
		dw	Offset Century_Item	    ,Offset Do_Century
		dw	Offset DATE_ITEM	    ,Offset Do_Date
		dw	Offset Month_Item	    ,Offset Do_Month
		dw	Offset HOUR_ITEM	    ,Offset Write_Time_To_CMOS
		dw	Offset MINUTE_ITEM	    ,Offset Write_Time_To_CMOS
		dw	Offset SECOND_ITEM	    ,Offset Write_Time_To_CMOS
		dw	offset Temp_Year_Item       ,offset Do_Temp_Year

StdCMOS_Do_NO	EQU	(($ - offset StdCMOS_Special_Do)-2)/4

StdCMOS_Special_Show:
		dw	StdCMOS_Show_NO
;R58 		dw	Offset EXTITEM		    ,Offset Show_Ext_Mem
;R57ifdef	Support_Calender_In_Setup
;R57		dw	Offset TEMP_EXTMEM_ITEM	    ,Offset Show_Ext_Mem
;R57endif	;Support_Calender_In_Setup
;R58 		dw	Offset OTHERITEM	    ,Offset Show_Other_Mem
;R58 		dw	Offset TOTALITEM	    ,Offset Show_Total_Mem
 		dw	offset Year_Item	    ,offset Show_Year

;R57ifdef	Support_Calender_In_Setup
;R57		dw	Offset Century_Item ,Offset ReShow_Calender
;R57		dw	Offset DATE_ITEM    ,Offset ReShow_Calender
;R57		dw	Offset Month_Item   ,Offset ReShow_Calender
;R57		dw	offset Calender_Item,offset Show_Calender
;R57else	;Support_Calender_In_Setup
		dw	Offset Century_Item ,offset Reshow_Week_Day
		dw	Offset DATE_ITEM    ,offset Reshow_Week_Day
		dw	Offset Month_Item   ,offset Reshow_Week_Day
;R57endif	;Support_Calender_In_Setup

		dw	offset Day_Of_Week_Item	    ,offset Show_Week_Day
		dw	offset Temp_Year_Item	    ,offset Show_Temp_Year

StdCMOS_Show_NO	EQU	(($ - offset StdCMOS_Special_Show)-2)/4

StdCMOS_Key_List:
		dw	offset Seq_Up_By_Menu_List	;function for UP_ARROW
		dw	offset Seq_Down_By_Menu_List	;function for DOWN_ARROW
		dw	offset Seq_Up_By_Menu_List	;function for LEFT_ARROW
		dw	offset Seq_Down_By_Menu_List	;function for RIGHT_ARROW

;--------------------------------------------------------------------------------

StdCMOS_StartUp_Str	label	near

		db	V_WARN
ifdef	Support_4_IDE
;R11		BORDER1	<,40,14,79,21,0>
		BORDER1	<,40,15,79,21,0>	;R11
else	;Support_4_IDE
 		BORDER1	<,40,12,79,21,0>
endif	;Support_4_IDE

		BORDER1	<,0,START_Y+3,79,24,1>
 		BORDER1	<,0,21,79,24,1>

		BORDER1	<,0,21,79,21,0>
		POS	<,0,21>
		db	'Ç'
		POS	<,79,21>
		db	'¶'

		POS	<,40,21>
		db	'Á'

ifdef	Support_4_IDE
;R11		POS	<,79,14>
		POS	<,79,15>			;R11
else 	;Support_4_IDE
		POS	<,79,12>
endif	;Support_4_IDE

		db	'¶'

		STRSHOW	<,,,offset AWARD_Title>
		POS	<,30,PAGE_NAME_Y>
		db	'STANDARD CMOS SETUP'

ifdef	Support_4_IDE					;R11
		STRSHOW	<,,,Offset CYL_HEAD_STR_1>	;R11
endif	;Support_4_IDE					;R11


	;Help menu

		POS	<,2,22>
		db	'ESC : Quit'
		POS	<,2,23>
		db	'F1  : Help'
		POS	<,27,22>
		db	'      : Select Item'
ifNdef	Not_Change_Setup_Color				;R61
		POS	<,27,23>
		db	'(Shift)F2 : Change Color'
endif	;Not_Change_Setup_Color				;R61

		POS	<,57,22>
		db	'PU/PD/+/- : Modify'
;R57 ifdef	Support_Calender_In_Setup
;R57 		POS	<,57,23>
;R57 		db	'F3 : Toggle Calender'
;R57 endif	;Support_Calender_In_Setup

		CALLROUTINE <,offset Show_Mem_Info>	;R58

		db	0			;end of string

MegaByte	db	'('
;R60		ADDX	<,4>
		ADDX	<,5>				;R60
		db	'Mb)',0

;R43Help_Border	Label	Near
;R43		db	V_WARN
;R43		BORDER1	<,21,8,60,22,1+Empty_Border>
;R43		POS	<,22,21>
;R43		db	V_HILITE,'Press F1 or ESC to exit help'
;R43		db	0

;R43Clear_Help	Label	Near
;R43		db	V_NORMAL
;R43		CLEAR	<,21,8,60,22>
;R43		db	0

ifdef	Support_4_IDE					;R11
		Public	CYL_HEAD_STR_1			;R11
CYL_HEAD_STR_1:						;R11
		db	V_NORMAL			;R11
		BORDER1	<,5,9,75,9,0>			;R11
		POS	<,5,8>				;R11
		db	'HARD DISKS'			;R11
		ADDX	<,9>				;R11
		db	'TYPE'				;R11
;R45		ADDX	<,3>				;R11
		ADDX	<,4>				;R45
		db	'SIZE'				;R11
		STRSHOW	<,24,8,Offset CYL_HEAD_STR>	;R11
		db	0				;R11
endif	;Support_4_IDE					;R11


StdCMOS_START	LABEL	NEAR
;------------------------------------------------------------------
Yaxis	=	5

;R54 start
ifdef EVAL_MSG_In_STDCMOS
		menuitem <NOMODBIN+SHOWONLY,\
			  offset NullStr,NOCT,0,KERNAL_CONTROL,1,\
			  offset EVAL_MSG+1,0,0,1,4,0,0,offset NullStr>
endif ;EVAL_MSG_In_STDCMOS
;R54 end

;R56 start
ifdef SHOW_Msg_In_STDCMOS_For_OEM
		menuitem <NOMODBIN+SHOWONLY,\
			  offset NullStr,NOCT,0,KERNAL_CONTROL,1,\
			  offset OEM_Msg,0,0,5,4,0,0,offset NullStr>
endif ;SHOW_Msg_In_STDCMOS_For_OEM
;R56 end

Month_Item	label	near
;R06		menuitem <NOMODBIN+KEYIN+DIGIT3,\
		menuitem <NOMODBIN+KEYIN+DIGIT3+NODEFAULT,\
			  offset SnameD,NOCT,0,CMOS08,11111111b,\
			  offset Mstr,1,12,5,Yaxis,1,1,offset Help_Date>

DATE_ITEM	label	near
;R06		menuitem <NOMODBIN+KEYIN+SHOWNUM+DIGIT2,\
		menuitem <NOMODBIN+KEYIN+SHOWNUM+DIGIT2+NODEFAULT,\
			  offset NullStr,NOCT,0,CMOS07,11111111b,\
			  offset NullStr,1,31, 32,Yaxis,1,1,offset Help_Date>

Century_Item	label	near
;R06		menuitem <NOMODBIN+KEYIN+SHOWNUM+DIGIT2+SHOWONLY,\
		menuitem <NOMODBIN+KEYIN+SHOWNUM+DIGIT2+SHOWONLY+NODEFAULT,\
			  offset NullStr,NOCT,0,CMOS32,11111111b,\
			  offset NullStr,19,20,35,Yaxis,19,19,offset Help_Date>

Year_Item	label	near
;R06		menuitem <NOMODBIN+KEYIN+SHOWNUM+DIGIT2+SHOWONLY,\
		menuitem <NOMODBIN+KEYIN+SHOWNUM+DIGIT2+SHOWONLY+NODEFAULT,\
			  offset NullStr,NOCT,0,CMOS09,11111111b,\
			  offset NullStr,0,99,37,Yaxis,95,95,offset Help_Date>
;R15			  offset NullStr,0,99,37,Yaxis,94,94,offset Help_Date>

Temp_Year_Item	label	near
		menuitem <NOMODBIN+KEYIN+SHOWNUM+DIGIT4+CT_RVS,\
			  offset NullStr,NOCT,0,TEMP_YEAR,0FFFFh,\
			  offset NullStr,1994,2079,35,Yaxis,1998,1998,offset Help_Date>;R51
;R51			  offset NullStr,1994,2079,35,Yaxis,1997,1997,offset Help_Date>
;R42A			  offset NullStr,1994,2079,35,Yaxis,1996,1996,offset Help_Date>
;R42			  offset NullStr,1994,2099,35,Yaxis,1994,1994,offset Help_Date>
;R09			  offset NullStr,1900,2099,35,Yaxis,1994,1994,offset Help_Date>

Day_Of_Week_Item	label	near
		menuitem <NOMODBIN+SHOWONLY,\
			  offset NullStr,NOCT,0,DAY_OF_WEEK1,11111111b,\
			  offset Week_Day_Str,0,6,23,Yaxis,0,1,offset Help_Date>

;------------------------------------------------------------------
Yaxis	= Yaxis + 1
HOUR_ITEM	label	near
;R06		menuitem <NOMODBIN+KEYIN+SHOWNUM+DIGIT2,\
		menuitem <NOMODBIN+KEYIN+SHOWNUM+DIGIT2+NODEFAULT,\
			  offset SnameT,NOCT,0,CMOS04,11111111b,\
			  offset NullStr,0,23, 5,Yaxis,0,0,offset Help_Time>

MINUTE_ITEM	label	near
;R06		menuitem <NOMODBIN+KEYIN+SHOWNUM+DIGIT2,\
		menuitem <NOMODBIN+KEYIN+SHOWNUM+DIGIT2+NODEFAULT,\
			  offset DotStr,NOCT,0,CMOS02,11111111b,\
			  offset NullStr,0,59,26,Yaxis,0,0,offset Help_Time>

SECOND_ITEM	label	near
;R06		menuitem <NOMODBIN+KEYIN+SHOWNUM+DIGIT2,\
		menuitem <NOMODBIN+KEYIN+SHOWNUM+DIGIT2+NODEFAULT,\
			  offset DotStr,NOCT,0,CMOS00,11111111b,\
			  offset NullStr,0,59,31,Yaxis,0,0,offset Help_Time>

;------------------------------------------------------------------

DayLight_Item	label	near
		menuitem <0+ITEMDISABLE,\
			  offset Day_Light,NOCT,0,11h,00000100b,\
			  offset Dis_Str,0,1, 5,Yaxis+1,0,0,offset NullStr>

;------------------------------------------------------------------
MEMORY_X = 47
MEMORY_Y = 14

;R58ifdef	Support_4_IDE
;R58;R11MEMORY_Y = 15
;R58MEMORY_Y = 16		;R11
;R58endif	;Support_4_IDE
;R58
;R58BASEITEM	label	near
;R58		menuitem <NOMODBIN+SHOWONLY+CT_RVS+SHOWNUM+DIGIT5+NODEFAULT,\
;R58			  offset SnameBase,NOCT,0,CMOS15,0ffffh,\
;R58			  offset NullStr,0,0FFFFh,MEMORY_X,MEMORY_Y,0,1,offset NullStr>
;R58
;R58MEMORY_Y = MEMORY_Y + 1
;R58EXTITEM		label	near
;R58		menuitem <NOMODBIN+SHOWONLY+CT_RVS+SHOWNUM+DIGIT5+NODEFAULT,\
;R58			  offset SnameExt,NOCT,0,CMOS30,0ffffh,\
;R58			  offset NullStr,0,0FFFFh,MEMORY_X,MEMORY_Y,0,1,offset NullStr>
;R58
;R58MEMORY_Y = MEMORY_Y + 1
;R58OTHERITEM	Label	near
;R58		menuitem <NOMODBIN+SHOWONLY+NODEFAULT,\
;R58			  offset SnameOther,NOCT,0,0,0ffffh,\
;R58			  offset NullStr,0,0FFFFh,MEMORY_X,MEMORY_Y,0,1,offset NullStr>
;R58 
;R58 MEMORY_Y = MEMORY_Y + 2
;R58 TOTAL_MEM_X		EQU	MEMORY_Y - 1
;R58 TOTALITEM	Label	near
;R58 		menuitem <NOMODBIN+SHOWONLY+NODEFAULT,\
;R58 			  offset SnameTotal,NOCT,0,0,0ffffh,\
;R58 			  offset NullStr,0,0FFFFh,MEMORY_X,MEMORY_Y,0,1,offset NullStr>
;R58 
;R58 MEMORY_Y = MEMORY_Y - 1

;------------------------------------------------------------------
;R57 ifdef	Support_Calender_In_Setup
;R57 Calender_Item	Label	Near
;R57 		menuitem <NOMODBIN+SHOWONLY+ITEMDISABLE,\
;R57 			  offset Calender_Border,NOCT,0,KERNAL_CONTROL,00000001b,\
;R57 			  offset NullStr,0,0, 0,0,0,0,offset NullStr>
;R57 
;R57 
;R57 ;------------------------------------------------------------------
;R57 TEMP_MEM_X = 47
;R57 TEMP_MEM_Y = 6
;R57 		menuitem <NOMODBIN+SHOWONLY+CT_RVS+SHOWNUM+DIGIT5+NODEFAULT+ITEMDISABLE,\
;R57 			  offset SnameBase1,NOCT,0,CMOS15,0ffffh,\
;R57 			  offset NullStr,0,0FFFFh,TEMP_MEM_X,TEMP_MEM_Y,0,1,offset NullStr>
;R57 TEMP_EXTMEM_ITEM:
;R57 		menuitem <NOMODBIN+SHOWONLY+CT_RVS+SHOWNUM+DIGIT5+NODEFAULT+ITEMDISABLE,\
;R57 			  offset SnameExt,NOCT,0,CMOS30,0ffffh,\
;R57 			  offset NullStr,0,0FFFFh,TEMP_MEM_X,TEMP_MEM_Y+1,0,1,offset NullStr>
;R57 ;------------------------------------------------------------------
;R57 endif	;Support_Calender_In_Setup

;R10 - start
ifdef	HardDrive_AUTO_DEFAULT
HDC_D4		EQU	47		;auto
ifdef	IDE_PRIMARY_ONLY		;R27
HDD_D4		EQU	0		;R27
else	;IDE_PRIMARY_ONLY		;R27
HDD_D4		EQU	47		;auto
endif	;IDE_PRIMARY_ONLY		;R27
HDE_D4		EQU	47		;auto
ifdef	IDE_PRIMARY_ONLY		;R27
HDF_D4		EQU	0		;R27
else	;IDE_PRIMARY_ONLY		;R27
HDF_D4		EQU	47		;auto
endif	;IDE_PRIMARY_ONLY		;R27
else;	HardDrive_AUTO_DEFAULT
HDC_D4		EQU	0		;none
HDD_D4		EQU	0		;none
HDE_D4		EQU	0		;none
HDF_D4		EQU	0		;none
endif;	HardDrive_AUTO_DEFAULT
;R10 - end

HDD_X	=	5
Yaxis	=	Yaxis + 3
ifdef	Support_4_IDE		;R11
Yaxis	=	Yaxis + 1	;R11
endif	;Support_4_IDE		;R11
HDDC_ITEM	menuitem <KEYIN+SHOWNUM+DIGIT4,\
			  offset SnameKc,NOCT,2,CMOS19,11111111b,\
			  offset NullStr,0,49, HDD_X,Yaxis,0,HDC_D4,offset Help_Hdd>
;Size
HDD_X	=	HDD_X + 17
ifdef	Support_4_IDE		;R11
HDD_X	=	HDD_X + 9	;R11
endif	;Support_4_IDE		;R11
		menuitem <NOMODBIN+SHOWONLY+CT_RVS+SHOWNUM+DIGIT5,\
			  offset NullStr,NOCT,0,HDDSIZE,0ffffh,\
			  offset NullStr,0,0ffffh, HDD_X,Yaxis,0,0,offset Help_Hdd>
;Cylinder
HDDC_CYL_ITEM	Label	Near
HDD_X	=	HDD_X + 11
ifdef	IDE_LBA_MODE_SUPPORT
HDD_X	=	HDD_X - 2
endif	;IDE_LBA_MODE_SUPPORT
ifdef	Support_4_IDE		;R11
HDD_X	=	HDD_X - 2	;R11
endif	;Support_4_IDE		;R11
		menuitem <NOMODBIN+CT_RVS+KEYIN+SHOWNUM+DIGIT5,\
			  offset NullStr,NOCT,0,CYLINDER,0ffffh,\
			  offset NullStr,0,0FFFFh, HDD_X,Yaxis,0,0,offset Help_Hdd>
;Head
HDD_X	=	HDD_X + 8
ifdef	Support_4_IDE		;R11
HDD_X	=	HDD_X - 2	;R11
endif	;Support_4_IDE		;R11
		menuitem <NOMODBIN+KEYIN+SHOWNUM+DIGIT4,\
			  offset NullStr,NOCT,0,HEAD,0ffh,\
			  offset NullStr,0,0ffh, HDD_X,Yaxis,0,0,offset Help_Hdd>
;Precomp
HDD_X	=	HDD_X + 8
ifdef	Support_4_IDE		;R11
HDD_X	=	HDD_X - 1	;R11
endif	;Support_4_IDE		;R11
		menuitem <NOMODBIN+CT_RVS+KEYIN+SHOWNUM+DIGIT5,\
			  offset NullStr,NOCT,0,PRECOMP,0ffffh,\
			  offset NullStr,0,0FFFFh, HDD_X,Yaxis,0,0,offset Help_Hdd>
;Landzone
HDD_X	=	HDD_X + 10
ifdef	Support_4_IDE		;R11
HDD_X	=	HDD_X - 4	;R11
endif	;Support_4_IDE		;R11
		menuitem <NOMODBIN+CT_RVS+KEYIN+SHOWNUM+DIGIT5,\
			  offset NullStr,NOCT,0,LANDZONE,0ffffh,\
			  offset NullStr,0,0FFFFh, HDD_X,Yaxis,0,0,offset Help_Hdd>
;Sector
HDD_X	=	HDD_X + 9
ifdef	Support_4_IDE		;R11
HDD_X	=	HDD_X - 1	;R11
endif	;Support_4_IDE		;R11
		menuitem <NOMODBIN+KEYIN+SHOWNUM+DIGIT4,\
			  offset NullStr,NOCT,0,SECTOR,0ffh,\
			  offset NullStr,0,0ffh, HDD_X,Yaxis,0,0,offset Help_Hdd>

ifdef	IDE_LBA_MODE_SUPPORT
HDD_X	=	HDD_X + 7
ifdef	Support_4_IDE		;R11
HDD_X	=	HDD_X - 1	;R11
HDD_X	=	HDD_X - 1	;R11
endif	;Support_4_IDE		;R11
;R25		menuitem <NOMODBIN,\
;R39		menuitem <0,\
;R39			  offset NullStr,NOCT,0,CMOS3B,00001100b,\
;R39			  offset HDD_CHS_LBA,0,3,HDD_X,Yaxis,0,0ch,offset Help_Hdd>	;R26
;R39 start
		menuitem <0,\
			  offset NullStr,NOCT,0,CMOS_LBA_LGA,00110000b,\
			  offset HDD_CHS_LBA,0,3,HDD_X,Yaxis,0,30h,offset Help_Hdd>	;R26
;R39 end
;R26			  offset HDD_CHS_LBA,0,2,HDD_X,Yaxis,0,0,offset Help_Hdd>
endif	;IDE_LBA_MODE_SUPPORT

;------------------------------------------------------------------

		Public	HDD_TYPE_DIFF
HDD_TYPE_DIFF	EQU	($ - offset HDDC_ITEM)

HDD_X	=	5
ifdef	IDE_PRIMARY_ONLY			;R27
	SLAVE_ITEM = ITEMDISABLE		;R27
else	;IDE_PRIMARY_ONLY			;R27
	SLAVE_ITEM = 0				;R27
Yaxis	= Yaxis + 1
endif	;IDE_PRIMARY_ONLY			;R27

HDDD_ITEM	menuitem <KEYIN+SHOWNUM+DIGIT4+SLAVE_ITEM,\
  		  offset SnameKd,NOCT,2,CMOS1A,11111111b,\
		  offset NullStr,0,48, HDD_X,Yaxis,0,HDD_D4,offset Help_Hdd>

;Size
HDD_X	=	HDD_X + 17
ifdef	Support_4_IDE		;R11
HDD_X	=	HDD_X + 9	;R11
endif	;Support_4_IDE		;R11
		menuitem <NOMODBIN+SHOWONLY+CT_RVS+SHOWNUM+DIGIT5+SLAVE_ITEM,\
			  offset NullStr,NOCT,0,HDDSIZE,0ffffh,\
			  offset NullStr,0,0ffffh, HDD_X,Yaxis,0,0,offset Help_Hdd>
;Cylinder
HDDD_CYL_ITEM	Label	Near
HDD_X	=	HDD_X + 11
ifdef	IDE_LBA_MODE_SUPPORT
HDD_X	=	HDD_X - 2
endif	;IDE_LBA_MODE_SUPPORT
ifdef	Support_4_IDE		;R11
HDD_X	=	HDD_X - 2	;R11
endif	;Support_4_IDE		;R11
		menuitem <NOMODBIN+CT_RVS+KEYIN+SHOWNUM+DIGIT5+SLAVE_ITEM,\
			  offset NullStr,NOCT,0,CYLINDER,0ffffh,\
			  offset NullStr,0,0FFFFh, HDD_X,Yaxis,0,0,offset Help_Hdd>
;Head
HDD_X	=	HDD_X + 8
ifdef	Support_4_IDE		;R11
HDD_X	=	HDD_X - 2	;R11
endif	;Support_4_IDE		;R11
		menuitem <NOMODBIN+KEYIN+SHOWNUM+DIGIT4+SLAVE_ITEM,\
			  offset NullStr,NOCT,0,HEAD,0ffh,\
			  offset NullStr,0,0ffh, HDD_X,Yaxis,0,0,offset Help_Hdd>
;Precomp
HDD_X	=	HDD_X + 8
ifdef	Support_4_IDE		;R11
HDD_X	=	HDD_X - 1	;R11
endif	;Support_4_IDE		;R11
		menuitem <NOMODBIN+CT_RVS+KEYIN+SHOWNUM+DIGIT5+SLAVE_ITEM,\
			  offset NullStr,NOCT,0,PRECOMP,0ffffh,\
			  offset NullStr,0,0FFFFh, HDD_X,Yaxis,0,0,offset Help_Hdd>
;Landzone
HDD_X	=	HDD_X + 10
ifdef	Support_4_IDE		;R11
HDD_X	=	HDD_X - 4	;R11
endif	;Support_4_IDE		;R11
		menuitem <NOMODBIN+CT_RVS+KEYIN+SHOWNUM+DIGIT5+SLAVE_ITEM,\
			  offset NullStr,NOCT,0,LANDZONE,0ffffh,\
			  offset NullStr,0,0FFFFh, HDD_X,Yaxis,0,0,offset Help_Hdd>
;Sector
HDDD_Sector_Item	Label	near
HDD_X	=	HDD_X + 9
ifdef	Support_4_IDE		;R11
HDD_X	=	HDD_X - 1	;R11
endif	;Support_4_IDE		;R11
		menuitem <NOMODBIN+KEYIN+SHOWNUM+DIGIT4+SLAVE_ITEM,\
			  offset NullStr,NOCT,0,SECTOR,0ffh,\
			  offset NullStr,0,0ffh, HDD_X,Yaxis,0,0,offset Help_Hdd>

ifdef	IDE_LBA_MODE_SUPPORT
HDD_X	=	HDD_X + 7
ifdef	Support_4_IDE		;R11
HDD_X	=	HDD_X - 1	;R11
HDD_X	=	HDD_X - 1	;R11
endif	;Support_4_IDE		;R11
;R25		menuitem <NOMODBIN,\
;R39		menuitem <0+SLAVE_ITEM,\
;R39			  offset NullStr,NOCT,0,CMOS3C,00001100b,\
;R39			  offset HDD_CHS_LBA,0,3,HDD_X,Yaxis,0,0ch,offset Help_Hdd>	;R26
;R39 start
		menuitem <0+SLAVE_ITEM,\
			  offset NullStr,NOCT,0,CMOS_LBA_LGA,11000000b,\
			  offset HDD_CHS_LBA,0,3,HDD_X,Yaxis,0,0c0h,offset Help_Hdd>
;R39 end
;R26			  offset HDD_CHS_LBA,0,2,HDD_X,Yaxis,0,0,offset Help_Hdd>
endif	;IDE_LBA_MODE_SUPPORT

;------------------------------------------------------------------
ifdef	Support_4_IDE
HDD_X	=	5
Yaxis	= Yaxis + 1
HDDE_ITEM	menuitem <KEYIN+SHOWNUM+DIGIT4,\
	  		  offset SnameKe,NOCT,2,CMOS_HDDE,01111111b,\
			  offset NullStr,0,51, HDD_X,Yaxis,0,HDE_D4,offset Help_Hdd>

;Size
HDD_X	=	HDD_X + 17
HDD_X	=	HDD_X + 9	;R11
		menuitem <NOMODBIN+SHOWONLY+CT_RVS+SHOWNUM+DIGIT5,\
			  offset NullStr,NOCT,0,HDDSIZE,0ffffh,\
			  offset NullStr,0,0ffffh, HDD_X,Yaxis,0,0,offset Help_Hdd>
;Cylinder
HDDE_CYL_ITEM	Label	Near
HDD_X	=	HDD_X + 11
ifdef	IDE_LBA_MODE_SUPPORT
HDD_X	=	HDD_X - 2
endif	;IDE_LBA_MODE_SUPPORT
HDD_X	=	HDD_X - 2	;R11
		menuitem <NOMODBIN+CT_RVS+KEYIN+SHOWNUM+DIGIT5,\
			  offset NullStr,NOCT,0,CYLINDER,0ffffh,\
			  offset NullStr,0,0FFFFh, HDD_X,Yaxis,0,0,offset Help_Hdd>
;Head
HDD_X	=	HDD_X + 8
HDD_X	=	HDD_X - 2	;R11
		menuitem <NOMODBIN+KEYIN+SHOWNUM+DIGIT4,\
			  offset NullStr,NOCT,0,HEAD,0ffh,\
			  offset NullStr,0,0ffh, HDD_X,Yaxis,0,0,offset Help_Hdd>
;Precomp
HDD_X	=	HDD_X + 8
HDD_X	=	HDD_X - 1	;R11
		menuitem <NOMODBIN+CT_RVS+KEYIN+SHOWNUM+DIGIT5,\
			  offset NullStr,NOCT,0,PRECOMP,0ffffh,\
			  offset NullStr,0,0FFFFh, HDD_X,Yaxis,0,0,offset Help_Hdd>
;Landzone
HDD_X	=	HDD_X + 10
HDD_X	=	HDD_X - 4	;R11
		menuitem <NOMODBIN+CT_RVS+KEYIN+SHOWNUM+DIGIT5,\
			  offset NullStr,NOCT,0,LANDZONE,0ffffh,\
			  offset NullStr,0,0FFFFh, HDD_X,Yaxis,0,0,offset Help_Hdd>
;Sector
HDDE_Sector_Item	Label	near
HDD_X	=	HDD_X + 9
HDD_X	=	HDD_X - 1	;R11
		menuitem <NOMODBIN+KEYIN+SHOWNUM+DIGIT4,\
			  offset NullStr,NOCT,0,SECTOR,0ffh,\
			  offset NullStr,0,0ffh, HDD_X,Yaxis,0,0,offset Help_Hdd>

ifdef	IDE_LBA_MODE_SUPPORT
HDD_X	=	HDD_X + 7
HDD_X	=	HDD_X - 1	;R11
HDD_X	=	HDD_X - 1	;R11
;R25		menuitem <NOMODBIN,\
		menuitem <0,\
			  offset NullStr,NOCT,0,CMOS_LBA_LGA,00000011b,\
			  offset HDD_CHS_LBA,0,3,HDD_X,Yaxis,0,3,offset Help_Hdd>	;R26
;R26			  offset HDD_CHS_LBA,0,2,HDD_X,Yaxis,0,0,offset Help_Hdd>
endif	;IDE_LBA_MODE_SUPPORT

;------------------------------------------------------------------
HDD_X	=	5
Yaxis	= Yaxis + 1
HDDF_ITEM	menuitem <KEYIN+SHOWNUM+DIGIT4+SLAVE_ITEM,\
	  		  offset SnameKf,NOCT,2,CMOS_HDDF,01111111b,\
			  offset NullStr,0,50, HDD_X,Yaxis,0,HDF_D4,offset Help_Hdd>

;Size
HDD_X	=	HDD_X + 17
HDD_X	=	HDD_X + 9	;R11
		menuitem <NOMODBIN+SHOWONLY+CT_RVS+SHOWNUM+DIGIT5+SLAVE_ITEM,\
			  offset NullStr,NOCT,0,HDDSIZE,0ffffh,\
			  offset NullStr,0,0ffffh, HDD_X,Yaxis,0,0,offset Help_Hdd>
;Cylinder
HDDF_CYL_ITEM	Label	Near
HDD_X	=	HDD_X + 11
ifdef	IDE_LBA_MODE_SUPPORT
HDD_X	=	HDD_X - 2
endif	;IDE_LBA_MODE_SUPPORT
HDD_X	=	HDD_X - 2	;R11
		menuitem <NOMODBIN+CT_RVS+KEYIN+SHOWNUM+DIGIT5+SLAVE_ITEM,\
			  offset NullStr,NOCT,0,CYLINDER,0ffffh,\
			  offset NullStr,0,0FFFFh, HDD_X,Yaxis,0,0,offset Help_Hdd>
;Head
HDD_X	=	HDD_X + 8
HDD_X	=	HDD_X - 2	;R11
		menuitem <NOMODBIN+KEYIN+SHOWNUM+DIGIT4+SLAVE_ITEM,\
			  offset NullStr,NOCT,0,HEAD,0ffh,\
			  offset NullStr,0,0ffh, HDD_X,Yaxis,0,0,offset Help_Hdd>
;Precomp
HDD_X	=	HDD_X + 8
HDD_X	=	HDD_X - 1	;R11
		menuitem <NOMODBIN+CT_RVS+KEYIN+SHOWNUM+DIGIT5+SLAVE_ITEM,\
			  offset NullStr,NOCT,0,PRECOMP,0ffffh,\
			  offset NullStr,0,0FFFFh, HDD_X,Yaxis,0,0,offset Help_Hdd>
;Landzone
HDD_X	=	HDD_X + 10
HDD_X	=	HDD_X - 4	;R11
		menuitem <NOMODBIN+CT_RVS+KEYIN+SHOWNUM+DIGIT5+SLAVE_ITEM,\
			  offset NullStr,NOCT,0,LANDZONE,0ffffh,\
			  offset NullStr,0,0FFFFh, HDD_X,Yaxis,0,0,offset Help_Hdd>
;Sector
HDDF_Sector_Item	Label	near
HDD_X	=	HDD_X + 9
HDD_X	=	HDD_X - 1	;R11
		menuitem <NOMODBIN+KEYIN+SHOWNUM+DIGIT4+SLAVE_ITEM,\
			  offset NullStr,NOCT,0,SECTOR,0ffh,\
			  offset NullStr,0,0ffh, HDD_X,Yaxis,0,0,offset Help_Hdd>

ifdef	IDE_LBA_MODE_SUPPORT
HDD_X	=	HDD_X + 7
HDD_X	=	HDD_X - 1	;R11
HDD_X	=	HDD_X - 1	;R11
;R25		menuitem <NOMODBIN,\
		menuitem <0+SLAVE_ITEM,\
			  offset NullStr,NOCT,0,CMOS_LBA_LGA,00001100b,\
			  offset HDD_CHS_LBA,0,3,HDD_X,Yaxis,0,0ch,offset Help_Hdd>	;R38h
;R38			  offset HDD_CHS_LBA,0,3,HDD_X,Yaxis,0,0,offset Help_Hdd>	;R26
;R26			  offset HDD_CHS_LBA,0,2,HDD_X,Yaxis,0,0,offset Help_Hdd>
endif	;IDE_LBA_MODE_SUPPORT

;------------------------------------------------------------------
endif	;Support_4_IDE

Yaxis	= Yaxis + 2
;Drive A
DRIVE_A_ITEM:

ifdef	DEFAULT_NO_FLOPPY
		menuitem <0,\
			  offset SnameA,NOCT,11110000b,CMOS10,11110000b,\
			  offset Vstr,0,5, 5,Yaxis,0,00h,offset Std_Help_Str>;R18
else	;DEFAULT_NO_FLOPPY

;R20 - Start
;R34ifdef	DRIVE_A_DEFAULE_1M44
		menuitem <0,\
			  offset SnameA,NOCT,11110000b,CMOS10,11110000b,\
			  offset Vstr,0,5, 5,Yaxis,0,40h,offset Std_Help_Str>
;R34else	;DRIVE_A_DEFAULE_1M44
;R34;R20 - End
;R34		menuitem <0,\
;R34			  offset SnameA,NOCT,11110000b,CMOS10,11110000b,\
;R34			  offset Vstr,0,5, 5,Yaxis,0,20h,offset Std_Help_Str>
;R34endif	;DRIVE_A_DEFAULE_1M44	;R20
endif	;DEFAULT_NO_FLOPPY

;------------------------------------------------------------------
Yaxis	= Yaxis + 1
;Drive B
;R29 - start
ifndef	Support_1_FDD	
DRIVE_B_ITEM:
		menuitem <0,\
			  offset SnameB,NOCT,00001111b,CMOS10,00001111b,\
			  offset Vstr,0,5, 5,Yaxis,0,0,offset Std_Help_Str>;R18
else	;Support_1_FDD	
;R48 DRIVE_B_ITEM:
;R48 		menuitem <0+ITEMDISABLE,\
;R48 			  offset SnameB,NOCT,00001111b,CMOS10,00001111b,\
;R48 			  offset Vstr,0,5, 5,Yaxis,0,0,offset Std_Help_Str>;R18
endif	;Support_1_FDD	
;R29 - end

;R35 - start
ifdef S3VGA_TV_Tuner
		PUBLIC  VGA_FEAT_ITEM
VGA_FEAT_ITEM:
		menuitem <0,\
			  offset VGA_FEAT_STR,NOCT,00000001b,37H,00000001b,\
			  offset DIS_STR,0,1, 5,Yaxis+1,1,1,offset Std_Help_Str>;R18
endif; S3VGA_TV_Tuner
;R35 - end
;------------------------------------------------------------------
;R16 - start
ifdef	FDD_3_Mode
ifndef	FDD_3_Mode_in_Cfeature				;R17
Yaxis	= Yaxis + 1
		Public	DRIVE_MODE_ITEM
DRIVE_MODE_ITEM:
;R31		menuitem <0,\
;R31			  offset Mode_Str,NOCT,00100000b,3Ch,00100000b,\
;R31			  offset Dis_str,0,1, 5,Yaxis,0,0h,offset Std_Help_Str>;R18
;R33 - start
ifdef	Support_1_FDD	
		menuitem <0,\
			  offset Mode_Str,NOCT,00000001b,FDD_3mode_CMOS,FDD_3mode_CMOS_Bits,\
			  offset Mode_Val,0,1, 5,Yaxis,0,FDD_3mode_DEFAULT,offset Std_Help_Str>
else	;Support_1_FDD	
;R33 - end
;R31 start
		menuitem <0,\
			  offset Mode_Str,NOCT,00000011b,FDD_3mode_CMOS,FDD_3mode_CMOS_Bits,\
			  offset Mode_Val,0,3, 5,Yaxis,0,0h,offset Std_Help_Str>
;R31 end
endif	;Support_1_FDD	
;R33 - end
endif;	FDD_3_Mode_in_Cfeature				;R17
endif	;FDD_3_Mode
;R16 - end

;R32A - start
;R50ifdef	Notebook_Power_Management	
;R50ifndef	NO_LCD_DISPLAY
;R50	LCD_CRT_OPTION		EQU	1
;R50endif	;NO_LCD_DISPLAY
;R50endif	;Notebook_Power_Management	
;R32A - end

;video
Video_Item:
Yaxis	= Yaxis + 2
;R32A - start
ifdef	LCD_CRT_OPTION				
		menuitem <0+HIDDEN,\
			  offset SnameV,NOCT,00110000b,CMOS14,00110000b,\
			  offset Dstr,0,3, 5,Yaxis,0,0,offset Std_Help_Str>;R18
else	;LCD_CRT_OPTION
;R32A - end
		menuitem <0,\
			  offset SnameV,NOCT,00110000b,CMOS14,00110000b,\
			  offset Dstr,0,3, 5,Yaxis,0,0,offset Std_Help_Str>;R18
endif	;LCD_CRT_OPTION				;R32A

;R32 - start
;R32A ifdef	Notebook_Power_Management	
;R32A ifndef	NO_LCD_DISPLAY					
ifdef	LCD_CRT_OPTION				;R32A
		Public	Disp_Mode_Item
Disp_Mode_Item:
;R32A Yaxis	= Yaxis + 2
;R32A ifdef	Support_4_IDE
;R32A Yaxis	= Yaxis - 1  
;R32A endif	;Support_4_IDE
;R40 - start
LCD_ITEM_Status	=	0
ifdef	LCD_ONLY
LCD_ITEM_Status	=	HIDDEN
endif	;LCD_ONLY
;R40 - end
;R53 		menuitem <0+LCD_ITEM_Status,\
;R53 			  offset Disp_Mode,NOCT,00000011b,DISP_CMOS,DISP_CMOS_BITE,\
;R53 			  offset Disp_Str,0,3, 5,Yaxis,0,DISP_CMOS_BITE,offset Std_Help_Str>	;R32C
;R53  start
		menuitem <0+LCD_ITEM_Status,\
			  offset Disp_Mode_Str,NOCT,00000011b,DISP_CMOS,DISP_CMOS_BITE,\
			  offset Disp_Str,0,3, 5,Yaxis,0,DISP_CMOS_BITE,offset Std_Help_Str>	;R32C
;R53  end
;R32C			  offset Disp_Str,0,3, 5,Yaxis,0,0,offset Std_Help_Str>	;R32B
;R32B			  offset Disp_Str,0,2, 5,Yaxis,0,0,offset Std_Help_Str>
endif	;LCD_CRT_OPTION				;R32A
;R32A endif	;NO_LCD_DISPLAY					
;R32A endif	;Notebook_Power_Management	
;R32 - end

;R44 - start
ifdef	TV_OUT_SUPPORT
ifndef	TV_Out_In_IOFEAT		;R64
ifndef	TV_Out_Not_IN_STDCMOS		;R63
		Public	TV_OUT_ITEM
TV_OUT_ITEM	Label	Near
Yaxis	= Yaxis + 1
endif;	TV_Out_In_IOFEAT		;R64
endif;	TV_Out_Not_IN_STDCMOS		;R63
;R62 - start
ifdef	Issue_Gemlight_TV_Out_Function
ifndef	TV_Out_In_IOFEAT		;R64
ifndef	TV_Out_Not_IN_STDCMOS		;R63
		menuitem <0,\
			  offset TV_Out_Mode,NOCT,TV_CMOS_BIT,TV_CMOS,TV_CMOS_BIT,\
			  offset TV_Out_Mode_Str,0,1, 5,Yaxis,0,0,offset Std_Help_Str>
endif;	TV_Out_Not_IN_STDCMOS		;R63
endif;	TV_Out_In_IOFEAT		;R64
else;	Issue_Gemlight_TV_Out_Function
;R62 - end
		menuitem <0,\
			  offset TV_Out_Mode,NOCT,00000011b,TV_CMOS,TV_CMOS_BITE,\
			  offset TV_Out_Str,0,3, 5,Yaxis,0,0,offset Std_Help_Str>
endif;	Issue_Gemlight_TV_Out_Function		;R62
endif	;TV_OUT_SUPPORT
;R44 - end
;------------------------------------------------------------------
		public	HaltOn_Item
HaltOn_Item	label	near
Yaxis	= Yaxis + 2
ifdef	Support_4_IDE		;R11
Yaxis	= Yaxis - 1		;R11
endif	;Support_4_IDE		;R11
ifndef	NO_Error_For_HaltOn_Item_D4	;R55 
		menuitem <0,\
			  offset SnameH,NOCT,7,CMOS3E,00000111b,\
			  offset Hstr,0,6, 5,Yaxis,0,010b,offset Std_Help_Str>	;R51
;R51			  offset Hstr,0,6, 5,Yaxis,0,0,offset Std_Help_Str>	;R24A
;R24A			  offset Hstr,0,7, 5,Yaxis,0,0,offset Std_Help_Str>	;R24
;R24			  offset Hstr,0,6, 5,Yaxis,0,0,offset Std_Help_Str>
else;	NO_Error_For_HaltOn_Item_D4	;R55 - start
ifNdef	HaltOn_Item_BIOS_D4_Value			  ;R55A
		menuitem <0,\
			  offset SnameH,NOCT,7,CMOS3E,00000111b,\
			  offset Hstr,0,6, 5,Yaxis,0,001b,offset Std_Help_Str>	;R51
;R55A -start
else	;HaltOn_Item_BIOS_D4_Value	
		menuitem <0,\
			  offset SnameH,NOCT,7,CMOS3E,00000111b,\
			  offset Hstr,0,6, 5,Yaxis,HaltOn_Item_BIOS_D4_Value,HaltOn_Item_SETUP_D4_Value,offset Std_Help_Str>
endif	;HaltOn_Item_BIOS_D4_Value			
;R55A -end
endif;	NO_Error_For_HaltOn_Item_D4	;R55 - end

;------------------------------------------------------------------
DLAST_ITEM	LABEL	NEAR

StdCMOS_END	LABEL	NEAR

Nullstr		db	0
DotStr		db	': ',0
SnameD		db	'Date (mm:dd:yy) : '
		ADDX	<,5>
		db	0
SnameT		db	'Time (hh:mm:ss) : ',0

Day_Light	db	'Daylight Saving : ',0

SnameA		db	'Drive A : ',0
SnameB		db	'Drive B : ',0
SnameV		db	'Video   : ',0
SnameH		db	'Halt On : ',0

;R32 - start
;R32A ifdef	Notebook_Power_Management	
;R32A ifndef	NO_LCD_DISPLAY				
ifdef	LCD_CRT_OPTION				;R32A
;R53 Disp_Mode	db	'LCD&CRT : ',0
Disp_Mode_Str	db	'LCD&CRT : ',0		;R53 
Disp_Str	db	'Both',0
		db	'LCD ',0
		db	'CRT ',0
;R32B		db	'None',1
ifdef	NO_CRT_AUTO_DETECT			;R41
		db	'None',1		;R41
else	;NO_CRT_AUTO_DETECT			;R41
		db	'Auto',0		;R32B
endif	;NO_CRT_AUTO_DETECT			;R41
endif	;LCD_CRT_OPTION				;R32A
;R32A endif	;NO_LCD_DISPLAY				
;R32A endif	;Notebook_Power_Management	
;R32 - end
;R02 SnameKc		STRSHOW <,,,offset SnameKd>
;R02 		SUBX	<,4>
;R02 		db	'C'
;R02 		SUBY	<,1>

;R44 - start
ifdef	TV_OUT_SUPPORT
ifndef	TV_Out_Not_IN_STDCMOS		;R63
TV_Out_Mode	db	'TV Mode : ',0
TV_Out_Str	db	'Disable',0
;R62		db	'NTSC   ',0
TV_Out_Mode_Str	db	'NTSC   ',0		;R62
		db	'PAL    ',0
		db	'       ',1
endif;	TV_Out_Not_IN_STDCMOS		;R63
endif	;TV_OUT_SUPPORT
;R44 - end

;R02 - starts
SnameKc:
ifdef	Support_4_IDE					;R11
		db	'Primary Master   : '		;R11
		db	0				;R11
else	;Support_4_IDE					;R11
		db	'Drive C : '
		STRSHOW <,21,,offset MegaByte>
		POS	<,12,>
		SUBY	<,1>
endif	;Support_4_IDE					;R11
;R02 - ends

		Public	CYL_HEAD_STR
CYL_HEAD_STR:
ifdef	IDE_LBA_MODE_SUPPORT
	ifdef	Support_4_IDE					;R11
		ADDX	<,15>					;R11
		db	'CYLS HEAD PRECOMP LANDZ SECTOR  MODE'	;R11
		SUBX	<,15+36>				;R11
	else	;Support_4_IDE					;R11
		ADDX	<,20>
		db	'CYLS.  HEADS  PRECOMP  LANDZONE  SECTORS  MODE'
		SUBX	<,59+4>
	endif	;Support_4_IDE					;R11
else	;IDE_LBA_MODE_SUPPORT
		ADDX	<,22>
		db	'CYLS.  HEADS  PRECOMP  LANDZONE  SECTORS'
		SUBX	<,59>
endif	;IDE_LBA_MODE_SUPPORT

ifdef	Support_4_IDE						;R11
		ADDY	<,2>					;R11
else	;Support_4_IDE						;R11
		ADDY	<,1>
endif	;Support_4_IDE						;R11

		db	0

SnameKd:
ifdef	Support_4_IDE						;R11
		db	'Primary Slave    : '			;R11
else	;Support_4_IDE						;R11
		db	'Drive D : '
		STRSHOW <,21,,offset MegaByte>
;R60		SUBX	<,14>
		SUBX	<,15>			;R60
endif	;Support_4_IDE						;R11
		db	0

ifdef	Support_4_IDE
;R05 start
SnameKe:
;R11		db	'Drive E : '
;R11		STRSHOW <,21,,offset MegaByte>
;R11		SUBX	<,14>
		db	'Secondary Master : '		;R11
		db	0

SnameKf:
;R11		db	'Drive F : '
;R11		STRSHOW <,21,,offset MegaByte>
;R11		SUBX	<,14>
		db	'Secondary Slave  : '		;R11
		db	0
;R05 end
comment %							;R05
SnameKe		STRSHOW <,,,offset SnameKd>
		SUBX	<,4>
		db	'E'
		ADDX	<,3>
		db	0

SnameKf		STRSHOW <,,,offset SnameKd>
		SUBX	<,4>
		db	'F'
		ADDX	<,3>
		db	0
%								;R05

endif	;Support_4_IDE

ifdef	IDE_LBA_MODE_SUPPORT
HDD_CHS_LBA		db	'NORMAL',0
			db	' LBA  ',0
			db	'LARGE ',0
			db	' AUTO ',0		;R26
LBA_Dont_Care_Str	db	'------',0
endif	;IDE_LBA_MODE_SUPPORT

;R58 SnameBase:
;R58 ;R57 ifdef	Support_Calender_In_Setup
;R58 ;R57 		STRSHOW	<,,,offset Clear_Calender>
;R58 ;R57 		CLEAR	<,TEMP_MEM_X,TEMP_MEM_Y,TEMP_MEM_X+25,TEMP_MEM_Y+1>
;R58 ;R57 endif	;Support_Calender_In_Setup
;R58 
;R58 SnameBase1:
;R58 		ADDX	<,4>
;R58 		db	'Base'
;R58 		STRSHOW	<,,,offset Mem_K_Str>
;R58 ;R47		ADDX	<,1>
;R58 		ADDX	<,2>				;R47
;R58 		db	0
;R58 
;R58 SnameExt	db	'Extended'
;R58 		STRSHOW	<,,,offset Mem_K_Str>
;R58 		db	0
;R58 
;R58 ;R47 SnameEms	db	'Expanded'
;R58 ;R47 		STRSHOW	<,,,offset Mem_K_Str>
;R58 ;R47 		db	0
;R58 
;R58 SnameOther	ADDX	<,3>
;R58 		db	'Other'
;R58 Mem_K_Str	db	' Memory:'
;R58 ;R47		ADDX	<,6>
;R58 		ADDX	<,7>				;R47
;R58 		db	'K'
;R58 ;R47		SUBX	<,7>
;R58 		SUBX	<,8>				;R47
;R58 		db	0
;R58 
;R58 SnameTotal	BORDER1	<,47,TOTAL_MEM_X,69,TOTAL_MEM_X,0>
;R58 		ADDY	<,1>
;R58 		SUBX	<,19>
;R58 		db	'Total'
;R58 		STRSHOW	<,,,offset Mem_K_Str>
;R58 		db	0

ifdef	FDD_3_Mode					;R16
;R31Mode_Str	db	'3 Mode  : ',0			;R16
Mode_Str	db	'Floppy 3 Mode Support : ',0	;R31
Mode_Val	db	'Disabled',0			;R31
		db	'Drive A ',0			;R31
ifndef	Support_1_FDD					;R33
		db	'Drive B ',0			;R31
		db	'Both    ',0			;R31
endif	;Support_1_FDD					;R33
;R16AVstr		db	'None           ',0		;R16
;R16A		db	'360K , 5.25 in.',0		;R16
;R16A		db	'1.2M, 5¬/3« in.',0		;R16
;R16A		db	'720K , 3.5 in. ',0		;R16
;R16A		db	'1.44M, 3.5 in. ',0		;R16
;R16A		db	'2.88M, 3.5 in. ',0		;R16
;R16Aelse	;FDD_3_Mode				;R16
endif	;FDD_3_Mode					;R16A
ifdef	Ct_FDD_3_Mode					;R30
Mode_Str	db	'3 Mode  : ',0			;R30
Vstr		db	'None           ',0		;R30
		db	'360K , 5.25 in.',0		;R30
		db	'1.2M, 5¬/3« in.',0		;R30
		db	'720K , 3.5 in. ',0		;R30
		db	'1.44M, 3.5 in. ',0		;R30
		db	'2.88M, 3.5 in. ',0		;R30
else	;Ct_FDD_3_Mode					;R30
Vstr		db	'None           ',0
ifndef	FDD_1M44_2M88_ONLY				;R49
		db	'360K , 5.25 in.',0
		db	'1.2M , 5.25 in.',0
		db	'720K , 3.5 in. ',0
else	;FDD_1M44_2M88_ONLY				;R49
		db	'360K , 5.25 in.',1		;R49
		db	'1.2M , 5.25 in.',1		;R49
		db	'720K , 3.5 in. ',1		;R49
endif	;FDD_1M44_2M88_ONLY				;R49
		db	'1.44M, 3.5 in. ',0
ifndef	FDD_1M44_ONLY					;R49
		db	'2.88M, 3.5 in. ',0
else;	FDD_1M44_ONLY					;R49
		db	'2.88M, 3.5 in. ',1		;R49
endif;	FDD_1M44_ONLY					;R49

;R16Aendif	;FDD_3_Mode					;R16
endif	;Ct_FDD_3_Mode					;R30

ifndef	Special_for_GIANTEC			;R46
Dstr		db	'EGA/VGA',0
		db	'CGA 40 ',0
		db	'CGA 80 ',0
		db	'MONO   ',0
else	;Special_for_GIANTEC			;R46
Dstr		db	'EGA/VGA',0		;R46
		db	'Absent ',0		;R46
		db	'CGA 80 ',0		;R46
		db	'MONO   ',0		;R46
endif	;Special_for_GIANTEC			;R46

;R24Acomment %						;R24
Hstr		db	'All Errors      ',0
		db	'No Errors       ',0
		db	'All,But Keyboard',0
		db	'Invalid         ',1
		db	'All,But Diskette',0
		db	'Invalid         ',1
		db	'All,But Disk/Key',0
;R24A%							;R24
comment %						;R24A
;R24 start
Hstr		db	'All Errors             ',0
		db	'No Errors              ',0
		db	'All,But Keyboard       ',0
		db	'Invalid                ',1
		db	'All,But Diskette       ',0
		db	'Invalid                ',1
		db	'All,But Disk/Key       ',0
		db	'All,But HDD Access Mode',0
;R24 end
%							;R24A

Ena_Str		db	'Enabled ',0
Dis_Str		db	'Disabled',0
		db	'Enabled ',0

;R56 start
ifdef SHOW_Msg_In_STDCMOS_For_OEM
OEM_Msg:
		db	'Machine Type/Model : '
		STRSHOW	<,,,offset System_Name_Show>
		ADDX	<,8>
		db	'System Serial Number : '
		STRSHOW	<,,,offset System_Ser_Show>
		db	0

		public	System_Name_Show
System_Name_Show:
		db	'MACHINE',0	;Machine Type/Model for STDCMOS show
		public	System_Ser_Show
System_Ser_Show:
		db	'SERIAL#',0   	;box or system serial No. for STDCMOS show
endif	;SHOW_Msg_In_STDCMOS_For_OEM
;R56 end

Mstr		db	'Jan',0
		db	'Feb',0
		db	'Mar',0
		db	'Apr',0
		db	'May',0
		db	'Jun',0
		db	'Jul',0
		db	'Aug',0
		db	'Sep',0
		db	'Oct',0
		db	'Nov',0
		db	'Dec',0

Week_Day_Str	db	'Sun,',0
		db	'Mon,',0
		db	'Tue,',0
		db	'Wed,',0
		db	'Thu,',0
		db	'Fri,',0
		db	'Sat,',0

ifdef Post_Auto_IDE_Detect		;R04
Auto_Str	db	'Auto',0	;R04
endif ;Post_Auto_IDE_Detect		;R04
User_Str	db	'User',0
None_Str	db	'None',0

;; Help strings

;R52AStd_Help_Str:
;R52A		db	1					;R52
;R52 		db	'Available Options:',NEWLINE,0

Help_Date:
		db	'DATE:',NEWLINE,NEWLINE
		db	'  Change the day, month, year',NEWLINE
		db	'  and century.',0

Help_Time:
		db	'TIME:',NEWLINE,NEWLINE
		db	'  Change the internal clock.',0

Help_Hdd:
		db	'FIXED DISK',NEWLINE,NEWLINE
		db	'  Selects the type of fixed disk.',NEWLINE
		db	'  ''User type'' will let you select the',NEWLINE
		db	'  number of cylinders, heads, etc.',NEWLINE,NEWLINE
		db	'  Note: PRECOMP=65535 means NONE !',0

ifdef S3VGA_TV_Tuner					;R35
VGA_FEAT_STR    db      'VGA Feature Connector: ',0	;R35
endif; S3VGA_TV_Tuner					;R35

;;; First Page ----------------------------------------------------- end

;R57 ifdef	Support_Calender_In_Setup
;R57 Cal_Xaxis	EQU	46
;R57 Cal_Yaxis	EQU	12
;R57 Calender_Border:
;R57 		STRSHOW	<,,,offset Clear_Calender>
;R57 		BORDER1	<,Cal_Xaxis,Cal_Yaxis+2,Cal_Xaxis+28,Cal_Yaxis+2,0>
;R57 		POS	<,Cal_Xaxis+1,Cal_Yaxis+1>
;R57 		db	'Sun Mon Tue Wed Thu Fri Sat'
;R57 		db	0
;R57 Clear_Calender:
;R57 		db	V_NORMAL
;R57 		CLEAR	<,Cal_Xaxis,Cal_Yaxis+1,Cal_Xaxis+28,Cal_Yaxis+8>
;R57 		db	0
;R57 endif	;Support_Calender_In_Setup


;************************************************************************
;*									*
;*									*
;*									*
;*			SUBROUTINES					*
;*									*
;*									*
;*									*
;************************************************************************



;************************************************************************
;*		SUBROUTINES for Date & Time				*
;************************************************************************

;[]===========================================================[]
;Write_Time_To_CMOS	-   1. Write date & time into CMOS
;			    2. Show Day of Week
;[]===========================================================[]
Write_Time_To_CMOS	Proc	Near
		cmp	al,Special_After
		jne	short Do_Time_Exit

		Public	WRITE_TIME_TO_CMOS1	;R59
Write_Time_To_CMOS1	Label	Near		;R59
;R59 Write_Time_To_CMOS1:

		pusha
		call	Read_Item_Value
		mov	ah,dl
		call	Hex_To_Bcd

ifndef	Dont_Stop_RTC_When_Update_RTC		;R66
		push	ax
		mov	ax,820bh		; stop update
		call	Set_cmos
		pop	ax
endif	;Dont_Stop_RTC_When_Update_RTC		;R66

		mov	al,[bx].CmosLoc		;get CMOS location to update
		call	Set_Cmos

ifndef	Dont_Stop_RTC_When_Update_RTC		;R66
		mov	ax,020bh		; resume update
		call	Set_cmos
endif	;Dont_Stop_RTC_When_Update_RTC		;R66

Time_No_Change:
		popa
Do_Time_Exit:
		clc
		ret
Write_Time_To_CMOS	Endp

;[]===========================================================[]
;[]===========================================================[]
Do_Century	Label	Near
Do_Month	Label	Near
Do_Date		Label	Near
Do_Year		Proc	Near
		cmp	al,Special_After
		jne	short @F
		call	Check_MonthDay_Max
		call	Write_Time_To_CMOS1
@@:
		ret
Do_Year		Endp

;[]===========================================================[]
;[]===========================================================[]
Do_Temp_Year	Proc	Near
		cmp	al,Special_After
		jne	short @F

;After normal Century-Year input

		mov	ax,TEMP_YEAR[bp]
		xor	dx,dx
		mov	cx,100
		div	cx
		mov	CMOS32[bp],ax
		mov	CMOS09[bp],dx
		push	bx
		mov	bx,offset Year_Item
		call	Write_Time_To_CMOS1
		mov	bx,offset Century_Item
		call	Write_Time_To_CMOS1
		call	Check_MonthDay_Max
		pop	bx
@@:
		clc
		ret
Do_Temp_Year	Endp

;[]==============================================================[]
;[]==============================================================[]
Show_Year	Proc	Near
		cmp	al,Special_After
		jne	short Show_Year_End

		push	bx
		mov	bx,offset Temp_Year_Item
		call	Display_Whole_Item
		pop	bx

Show_Year_End:
		clc
		ret
Show_Year	Endp

;[]===========================================================[]
;[]===========================================================[]
Show_Temp_Year	Proc	Near
		cmp	al,Special_Before
		jne	short After_Show_Temp_Year

		mov	al,CMOS32[bp]	;get century
		xor	ah,ah
		mov	cx,100
		mul	cx
		mov	cx,ax
		mov	al,CMOS09[bp]
		xor	ah,ah
		add	ax,cx

		mov	dx,ax
		call	Write_Item_Value
		mov	ax,dx

		jmp	short Show_Temp_Year_Exit

After_Show_Temp_Year:

;R57 ifdef	Support_Calender_In_Setup
;R57 
;R57 		call	ReShow_Calender1
;R57 
;R57 else	;Support_Calender_In_Setup

		call	Reshow_Week_Day

;R57 endif	;Support_Calender_In_Setup

Show_Temp_Year_Exit:

		clc
		ret
Show_Temp_Year	Endp

Reshow_Week_Day	Proc	Near
;R37		push	word ptr ATTRIBUTE[bp]
;R37		push	word ptr CURSOR_X[bp]
.386							;R37
		push	dword ptr ATTRIBUTE[bp]		;R37
		mov	bx,offset Day_Of_Week_Item
		call	Display_Whole_Item
		pop	dword ptr ATTRIBUTE[bp]		;R37
.286							;R37
;R37		pop	word ptr CURSOR_X[bp]
;R37		pop	word ptr ATTRIBUTE[bp]
		ret
Reshow_Week_Day	Endp

;[]==============================================================[]
;Show_Week_Day	 -  Calculate the day of week
;Subroutine type -  Pre-Show
;
;Output - Day_Of_Week[bp]
;[]==============================================================[]
Show_Week_Day	Proc	Near

		cmp	al,Special_Before
		jne	short Show_Week_Day_Exit

;--------------------------------------------------
;	calculate no. of days since 1-1-xx00
;--------------------------------------------------

		pusha
		mov	ax,365			;365 days per year
		xor	cx,cx
		mov	cl,CMOS09[bp]		;YEAR[bp]
		mul	cx			;no of days in ax

;add 1 day for 	every four years

		shr	cx,2
		add	ax,cx

;e.g. add 31 if it is February
;	  31+28 for March ....

		mov	si,offset cs:Day_Accum
		mov	cl,byte ptr CMOS08[bp]	;MONTH[bp]
		xor	ch,ch
		sub	cx,1
		shl	cx,1
		add	si,cx
		add	ax,cs:[si]

		test	byte ptr CMOS09[bp],03h	;YEAR[bp]
		jnz	short @F
		cmp	byte ptr CMOS08[bp],2	;MONTH[bp]
		ja	short @F
		dec	ax
@@:

;add day of month

		mov	cl,CMOS07[bp]		;DAY_OF_MONTH[bp]
		xor	ch,ch
		add	ax,cx

;tune for 19xx & 20xx

		cmp	byte ptr CMOS32[bp],19	;Century[bp]
		je	short @F
		add	ax,6
@@:

;--------------------------------------------------
;get the residue of ax/7 in dx
;  dx = 0 - Sunday
;  dx = 1 - Monday ...
;--------------------------------------------------

@@:		sub	ax,7
		jae	short @B
		add	ax,7
		mov	dx,ax

		call	Write_Item_Value

		popa

Show_Week_Day_Exit:

		clc
		ret

Show_Week_Day	Endp

;[]===========================================================[]
;[]===========================================================[]
Check_MonthDay_Max	Proc	Near
		pusha
		mov	si,offset cs:Day_Accum
		mov	al,CMOS08[bp]		;Month[bp]
		xor	ah,ah
		shl	ax,1
		sub	ax,2
		add	si,ax

		mov	ax,cs:[si+2]
		sub	ax,cs:[si]

		test	byte ptr CMOS09[bp],03h	;YEAR[bp],03h
		jnz	short @F
		cmp	byte ptr CMOS08[bp],2	;MONTH[bp],2
		jne	short @F
		inc	ax
@@:
		cmp	byte ptr CMOS07[bp],al	;DAY_OF_MONTH[bp]
		jbe	short Check_MonthDay_Exit

		mov	ah,al
		cmp	bx,offset Date_Item
		jne	short @F

		cmp	word ptr LAST_KEY[bp],PGUP
		je	short @F
		cmp	word ptr LAST_KEY[bp],K_MINUS
		je	short @F
		mov	ah,1
	@@:
		mov	byte ptr CMOS07[bp],ah	;DAY_OF_MONTH[bp]
		mov	bx,offset Date_Item
		call	Write_Time_To_CMOS1
		call	Display_Whole_Item

Check_MonthDay_Exit:

		popa
		ret
Check_MonthDay_Max	Endp

;[]========================================================================[]
;	no. of days accumulated since JAN 1 at 1st of each month
;[]========================================================================[]
Day_Accum	dw	00					;January
		dw	00+31					;February
		dw	00+31+28				;March
		dw	00+31+28+31				;April
		dw	00+31+28+31+30				;May
		dw	00+31+28+31+30+31			;June
		dw	00+31+28+31+30+31+30			;July
		dw	00+31+28+31+30+31+30+31			;August
		dw	00+31+28+31+30+31+30+31+31		;September
		dw	00+31+28+31+30+31+30+31+31+30		;October
		dw	00+31+28+31+30+31+30+31+31+30+31	;November
		dw	00+31+28+31+30+31+30+31+31+30+31+30	;December
		dw	00+31+28+31+30+31+30+31+31+30+31+30+31	;January

;R57 ifdef	Support_Calender_In_Setup
;R57 ;[]===========================================================[]
;R57 ;[]===========================================================[]
;R57 Toggle_Calender	Proc	Near
;R57 		push	bx
;R57 		cmp	ax,K_F3
;R57 		jne	short @F
;R57 		cmp	word ptr PAGE_START[bp],offset StdCMOS_START
;R57 		jne	short @F
;R57 		mov	bx,offset BASEITEM
;R57 Next_Mem_Item:
;R57 		push	cx
;R57 		call	Get_ItemStat_AX
;R57 		xor	ax,ITEMDISABLE
;R57 		call	Set_ItemStat_AX
;R57 		call	Display_Whole_Item
;R57 		add	bx,ITEM_SIZE
;R57 		pop	cx
;R57 		cmp	bx,offset TEMP_EXTMEM_ITEM
;R57 		jbe	short Next_Mem_Item
;R57 @@:
;R57 		pop	bx
;R57 		ret
;R57 Toggle_Calender	Endp
;R57 
;R57 ;[]===========================================================[]
;R57 ;[]===========================================================[]
;R57 ReShow_Calender	Proc	Near
;R57 
;R57 		cmp	al,Special_After
;R57 		jne	short ReShow_Calender_Exit
;R57 
;R57 ReShow_Calender1:
;R57 
;R57 		pusha
;R57 
;R57 ;R37		push	word ptr CURSOR_X[bp]
;R57 ;R37		push	word ptr ATTRIBUTE[bp]
;R57 ;R37 - starts
;R57 .386
;R57 		push	dword ptr ATTRIBUTE[bp]
;R57 .286
;R57 ;R37 - ends
;R57 		mov	bx,Offset Day_Of_Week_Item
;R57 		call	Display_Whole_Item
;R57 
;R57 		mov	bx,offset Calender_Item
;R57 		CHK_ITEMSTAT ITEMDISABLE
;R57 		jnz	short @F
;R57 		call	Show_Calender
;R57 @@:
;R57 ;R37 - starts
;R57 .386
;R57 		pop	dword ptr ATTRIBUTE[bp]
;R57 .286
;R57 ;R37 - ends
;R57 ;R37		pop	word ptr ATTRIBUTE[bp]
;R57 ;R37		pop	word ptr CURSOR_X[bp]
;R57 		popa
;R57 
;R57 ReShow_Calender_Exit:
;R57 
;R57 		clc
;R57 		ret
;R57 ReShow_Calender	Endp
;R57 
;R57 ;[]===========================================================[]
;R57 ;[]===========================================================[]
;R57 Show_Calender	PROC	NEAR
;R57 
;R57 		cmp	word ptr PAGE_START[bp],offset StdCMOS_START
;R57 		jne	short @B
;R57 		cmp	byte ptr IN_F1_HELP[bp],0
;R57 		jne	short @B
;R57 
;R57 		push	bx
;R57 		call	Vnormal
;R57 		lea	bx,Day_Of_week_Item
;R57 		call	Read_Item_Value		;dl = day of week
;R57 		inc	dl			;Week of first day = (dl+1)-(day % 7)
;R57 		mov	al,CMOS07[bp]		;get DAY_OF_MONTH
;R57 		xor	ah,ah
;R57 		mov	cl,7
;R57 		div	cl
;R57 		sub	dl,ah
;R57 		jnc	short not_over
;R57 		add	dl,7
;R57 not_over:					;dl = week of first day
;R57 
;R57 		sub	dl,7
;R57 		jae	short not_over
;R57 		add	dl,7
;R57 
;R57 		push	dx			;holding dl for show previous month
;R57 		shl	dl,2			;show this month -------- start
;R57 		add	dl,Cal_Xaxis+2		;screen position of first day
;R57 		mov	CURSOR_X[bp],dl
;R57 		mov	byte ptr CURSOR_Y[bp],Cal_Yaxis+3
;R57 		xor	bh,bh
;R57 		mov	bl,CMOS08[bp]		;MONTH[bp]
;R57 		shl	bx,1
;R57 		mov	cx,Day_Accum[bx]
;R57 		sub	cx,Day_Accum[bx-2]
;R57 		cmp	bl,4			;Is February?
;R57 		jnz	short not_February
;R57 		test	byte ptr CMOS09[bp],3	;YEAR[bp]
;R57 		jnz	short not_February
;R57 		inc	cl
;R57 not_February:
;R57 		mov	ax,1
;R57 		call	VHilite
;R57 		call	show_week_loop		;show this month -------- end
;R57 		call	Vnormal			;show next month -------- start
;R57 		xor	ch,ch
;R57 		mov	cl,Cal_Xaxis+30
;R57 		sub	cl,CURSOR_X[bp]
;R57 		shr	cl,2
;R57 		cmp	byte ptr CURSOR_Y[bp],Cal_Yaxis+8
;R57 		je	short Not_bottom
;R57 		add	cl,7
;R57 Not_bottom:
;R57 		mov	ax,1
;R57 		call	show_week_loop		;show next month -------- end
;R57 		pop	dx			;show previous month -------- start
;R57 		or	dl,dl			;is Sunday?
;R57 		jz	short Not_show_prev	;No show previous month
;R57 		xor	bh,bh
;R57 		mov	bl,CMOS08[bp]		;MONTH[bp]
;R57 		dec	bl			;get previous month
;R57 		jnz	short not_zero_month
;R57 		mov	bl,12			;force set bl = December
;R57 not_zero_month:
;R57 		shl	bx,1
;R57 		mov	ax,Day_Accum[bx]
;R57 		sub	ax,Day_Accum[bx-2]
;R57 		cmp	bl,4			;Is February?
;R57 		jnz	short not_February_1
;R57 		test	byte ptr CMOS09[bp],3	;YEAR[bp]
;R57 		jnz	short not_February_1
;R57 		inc	al
;R57 not_February_1:
;R57 		sub	al,dl
;R57 		inc	al
;R57 		mov	cl,dl
;R57 		xor	ch,ch
;R57 		mov	byte ptr CURSOR_X[bp],Cal_Xaxis+2
;R57 		mov	byte ptr CURSOR_Y[bp],Cal_Yaxis+3
;R57 		call	show_week_loop
;R57 Not_show_prev:					;show previous month -------- end
;R57 		pop	bx
;R57 
;R57 		stc
;R57 
;R57 		ret
;R57 Show_Calender	ENDP
;R57 
;R57 ;[]===========================================================[]
;R57 ;[]===========================================================[]
;R57 show_week_loop:
;R57 		push	cx
;R57 		push	ax
;R57 		and	byte ptr ATTRIBUTE[bp],not 80h
;R57 		cmp	al,CMOS07[bp]
;R57 		jne	short Not_Today
;R57 		push	bx
;R57 		mov	bx,Color_Offset[bp]
;R57 		mov	bl,[bx].CNORMAL
;R57 		cmp	byte ptr ATTRIBUTE[bp],bl
;R57 		pop	bx
;R57 		je	short Not_Today
;R57 
;R57 		or	byte ptr ATTRIBUTE[bp],80h
;R57 Not_Today:
;R57 		call	AX_To_DEC2
;R57 		call	Show_SIX_DIGIT
;R57 		add	byte ptr CURSOR_X[bp],2
;R57 		cmp	byte ptr CURSOR_X[bp],Cal_Xaxis+28
;R57 		jb	short show_next
;R57 		mov	byte ptr CURSOR_X[bp],Cal_Xaxis+2
;R57 		inc	byte ptr CURSOR_Y[bp]
;R57 show_next:
;R57 		pop	ax
;R57 		pop	cx
;R57 		inc	ax
;R57 		loop	show_week_loop
;R57 		ret
;R57 endif	;Support_Calender_In_Setup

;R58 ;************************************************************************
;R58 ;*		SUBROUTINES for Memory Items				*
;R58 ;************************************************************************
;R58 ;[]===========================================================[]
;R58 ; Show Total memory
;R58 ; Subroutine type : Pre-Show
;R58 ;[]===========================================================[]
;R58 Show_Total_Mem	Proc	Near
;R58 		mov	cl,READ_TOTAL
;R58 		jmp	short Show_Mem
;R58 Show_Total_Mem	Endp
;R58 
;R58 ;[]===========================================================[]
;R58 ; Show Other memory
;R58 ; Subroutine type : Pre-Show
;R58 ;[]===========================================================[]
;R58 Show_Other_Mem	Proc	Near
;R58 		mov	cl,READ_OTHER
;R58 		jmp	short Show_Mem
;R58 Show_Other_Mem	Endp
;R58 
;R58 ;[]===========================================================[]
;R58 ; Show EXT memory
;R58 ; Subroutine type : Pre-Show
;R58 ;[]===========================================================[]
;R58 Show_Ext_Mem	Proc	Near
;R58 		mov	cl,READ_EXT
;R58 		jmp	short Show_Mem
;R58 Show_Ext_Mem	Endp
;R58 
;R58 ;[]===========================================================[]
;R58 ; Show EMS memory
;R58 ; Subroutine type : Pre-Show
;R58 ;[]===========================================================[]
;R58 Show_EMS_Mem	Proc	Near
;R58			mov	cl,READ_EMS
;R58			jmp	short Show_Mem
;R58 Show_EMS_Mem	Endp
;R58
;R58 ;[]===========================================================[]
;R58 ; Show Memory
;R58 ; input : cl = memory type to show
;R58 ; Subroutine type : Pre-Show
;R58 ;[]===========================================================[]
;R58 Show_Mem	Proc	Near
;R58		cmp	al,Special_Before
;R58		jne	short Show_Mem_Exit
;R58
;R58		call	Read_Memory
;R58
;R58		call	BLAX_To_Dec6
;R58		call	Show_SIX_DIGIT
;R58		stc
;R58 Show_Mem_Exit:
;R58 		ret
;R58 Show_Mem	Endp
      
;R58 - starts
Show_Mem_Info	Proc	Near
		extrn	If_Code_Running_In_F000:near
		call	If_Code_Running_In_F000
		jne	short @F
		call	far ptr fPROC_Show_Mem_Info
	@@:
		retn
Show_Mem_Info	Endp
;R58 - ends
	
;************************************************************************
;*		SUBROUTINES for HDD Items				*
;************************************************************************

;R59 - starts
;[]===========================================================[]
;[]===========================================================[]
Move_HDD_Cursor	Proc	Near

		call	If_Code_Running_In_F000
		clc
		jne	short @F
		call	far ptr fPROC_Move_HDD_Cursor
	@@:
		ret

Move_HDD_Cursor	Endp

;---------------------------------------------------------------------
;input	:	BX = Item offset
;
;output	:	CY : not a HDD item: type, head., size...
;
;		NC : it is a HDD item
;		     BX = HDD type item offset, e.g. offset HDDC_ITEM
;		     SI = CMOS location for HDD type
;		     DI = CMOS location for User define parameter
;		     CH = CMOS location for LBA/CHS
;		     CL = which bit in CH define LBA/CHS
;		     ZF =  ZF: default type(0-46)
;			   NZ: user type
;
;Destroy :	DX, SI, DI, FLAGS
;---------------------------------------------------------------------
		Public	Get_HDD_CMOS_Info
Get_HDD_CMOS_Info	Proc	Near

		call	far ptr fPROC_Get_HDD_CMOS_Info
		ret

Get_HDD_CMOS_Info	Endp
;R59 - ends

;R59 ;[]===========================================================[]
;R59 ;[]===========================================================[]
;R59 		Public	Do_HDD
;R59 Do_HDD		Proc	Near
;R59 
;R59 		pusha
;R59 
;R59 		cmp	al,Special_After
;R59 		je	short Do_Post_HDD
;R59 
;R59 ;---------------------------------------------------------------------
;R59 Do_Pre_HDD:
;R59 		call	Move_HDD_Cursor
;R59 		call	Read_Item_Value
;R59 		mov	LAST_HDD_TYPE[bp],dl
;R59 		jmp	short Do_HDD_Exit
;R59 
;R59 ;---------------------------------------------------------------------
;R59 Do_Post_HDD:
;R59 		call	Skip_HDD_Type
;R59 		call	Prg_HDD_Parms_Attr
;R59 
;R59 		push	word ptr CMOS19[bp]
;R59 		call	Set_CMOS12h
;R59 		pop	word ptr CMOS19[bp]
;R59 
;R59 Do_HDD_Exit:
;R59 		popa
;R59 		clc
;R59 		ret
;R59 
;R59 Do_HDD		Endp

;R59 		Public	Skip_HDD_Type
;R59 Skip_HDD_Type	Proc	Near
;R59 		call	Read_Item_Value
;R59 
;R59 		xor	ax,ax
;R59 		jmp	short @F
;R59 
;R59 Skip_This_HDD:
;R59 		mov	ax,1
;R59 		cmp	word ptr LAST_KEY[bp],PGDN
;R59 		je	short @F
;R59 		cmp	word ptr LAST_KEY[bp],K_PLUS
;R59 		je	short @F
;R59 		mov	ax,-1
;R59 		cmp	word ptr LAST_KEY[bp],PGUP
;R59 		je	short @F
;R59 		cmp	word ptr LAST_KEY[bp],K_MINUS
;R59 		je	short @F
;R59 ;R08		mov	dl,LAST_HDD_TYPE[bp]
;R59 ;R08		xor	dh,dh
;R59 ;R08		xor	ax,ax
;R59 		mov	ax,1					;R08
;R59 	@@:
;R59 		add	dx,ax
;R59 
;R59 ;R08 - starts
;R59 ifdef	Skip_HDD_Type_1_To_46
;R59 		or	dl,dl
;R59 		jz	short @F
;R59 		cmp	dl,46
;R59 		jbe	short Skip_This_HDD
;R59 	@@:
;R59 endif	;Skip_HDD_Type_1_To_46
;R59 ;R08 - ends
;R59 		cmp	dl,46			;R14
;R59 		je	short Skip_This_HDD	;R14
;R59 
;R59 		mov	cx,NO_OF_SKIP_HDD
;R59 		mov	di,offset Skip_HDD_Type_Tbl
;R59 		cmp	bx,offset HDDC_ITEM
;R59 		je	short @F
;R59 		add	di,cx
;R59 
;R59 ifdef	Support_4_IDE
;R59 		cmp	bx,offset HDDD_ITEM
;R59 		je	short @F
;R59 		add	di,cx
;R59 		cmp	bx,offset HDDE_ITEM
;R59 		je	short @F
;R59 		add	di,cx
;R59 endif	;Support_4_IDE
;R59 
;R59 	@@:
;R59 		cmp	dl,cs:[di]
;R59 		je	short Skip_This_HDD
;R59 		inc	di
;R59 		loop	@B
;R59 
;R59 		call	Write_Item_Value
;R59 		ret
;R59 
;R59 Skip_HDD_Type	Endp
;R59 
;R59 ;[]===========================================================[]
;R59 ;[]===========================================================[]
;R59 Skip_HDD_Type_Tbl:
;R59 
;R59 ifdef	Support_4_IDE
;R59 
;R59 ifdef Post_Auto_IDE_Detect		;R04
;R59 		db	15,48,50,51	;R04
;R59 		db	15,49,50,51	;R04
;R59 		db	15,48,49,50	;R04
;R59 		db	15,48,49,51	;R04
;R59 else ;Post_Auto_IDE_Detect		;R04
;R59 		db	15,47,48,50,51	;drive C skip these options
;R59 		db	15,47,49,50,51	;drive D skip these options
;R59 		db	15,47,48,49,50	;drive E skip these options
;R59 		db	15,47,48,49,51	;drive F skip these options
;R59 endif ;Post_Auto_IDE_Detect		;R04
;R59 
;R59 else	;Support_4_IDE
;R59 
;R59 ifdef Post_Auto_IDE_Detect		;R04
;R59 		db	15,48		;R04
;R59 		db	15,49		;R04
;R59 else ;Post_Auto_IDE_Detect		;R04
;R59 		db	15,47,48	;drive C skip these options
;R59 		db	15,47,49	;drive D skip these options
;R59 endif ;Post_Auto_IDE_Detect		;R04
;R59 
;R59 endif	;Support_4_IDE
;R59 
;R59 NO_OF_SKIP_HDD	EQU	($ - offset Skip_HDD_Type_Tbl)/NUM_OF_IDE_ITEM
;R59 
;R59 ;R03 - start
;R59 HDD_Type_Cmos:
;R59 		db	CMOS19		;Drive 0
;R59 		db	CMOS1A		;Drive 1
;R59 		db	67H		;Drive 2
;R59 		db	70H		;Drive 3
;R59 ;R03 - end

;R59 ;[]===========================================================[]
;R59 ;[]===========================================================[]
;R59 		Public	Show_HDD
;R59 Show_HDD	Proc	Near
;R59 
;R59 ;-----------------
;R59 ;Before_Show_HDD:
;R59 ;-----------------
;R59 		cmp	al,Special_Before
;R59 		jne	short After_Show_HDD
;R59 
;R59 ;R08 - starts
;R59 ifdef	Skip_HDD_Type_1_To_46
;R59 		call	Check_If_HDD_Type_Item
;R59 		jne	short @F
;R59 		call	Skip_HDD_Type
;R59 	@@:
;R59 endif	;Skip_HDD_Type_1_To_46
;R59 ;R08 - ends
;R59 
;R59 		cmp	byte ptr HDD_CURSOR_FLG[bp],0ffh
;R59 		je	short @F
;R59 
;R59 		push	word ptr ATTRIBUTE[bp]
;R59 		call	Prg_HDD_Parms_Attr	;program the ITEMSTAT of cyl, head...
;R59 		jnc	short Skip_ReShow_HDD	;ITEMSTATs not changed
;R59 		call	ReShow_HDD
;R59 Skip_ReShow_HDD:
;R59 		pop	word ptr ATTRIBUTE[bp]
;R59 		call	Show_HDD_Cursor
;R59 	@@:
;R59 		ret
;R59 
;R59 ;-----------------
;R59 After_Show_HDD:
;R59 ;-----------------
;R59 		call	Check_If_HDD_Type_Item
;R59 		jne	short Show_User_Exit
;R59 Show_User:
;R59 		call	Read_Item_Value
;R59 		mov	si,offset None_Str
;R59 		or	dx,dx
;R59 		jz	short @F
;R59 		cmp	dx,48
;R59 		mov	si,offset User_Str
;R59 		jae	short @F
;R59 ifdef Post_Auto_IDE_Detect				;R04
;R59 		cmp	dx,47				;R04
;R59 		mov	si,offset Auto_Str		;R04
;R59 		je	short @F			;R04
;R59 endif ;Post_Auto_IDE_Detect				;R04
;R59 		ret
;R59 	@@:
;R59 		sub	byte ptr CURSOR_X[bp],4
;R59 		call	Display_String
;R59 Show_User_Exit:
;R59 		ret
;R59 
;R59 Show_HDD	Endp
;R59 
;R59 ifdef	IDE_LBA_MODE_SUPPORT
;R59 ;-------------------------------------------
;R59 ;-------------------------------------------
;R59 Check_If_LBA_Item	Proc	Near
;R59 		pusha
;R59 		call	Get_HDD_CMOS_Info
;R59 		add	dx,HDD_TYPE_DIFF-ITEM_SIZE	;point LBA item
;R59 		cmp	bx,dx
;R59 		popa
;R59 		ret
;R59 Check_If_LBA_Item	Endp
;R59 endif	;IDE_LBA_MODE_SUPPORT

;R59 ;-------------------------------------------
;R59 ;-------------------------------------------
;R59 		Public	Check_If_HDD_Type_Item
;R59 Check_If_HDD_Type_Item	Proc	Near
;R59 		cmp	bx,offset HDDC_ITEM
;R59 		je	short @F
;R59 		cmp	bx,offset HDDD_ITEM
;R59 
;R59 ifdef	Support_4_IDE
;R59 		je	short @F
;R59 		cmp	bx,offset HDDE_ITEM
;R59 		je	short @F
;R59 		cmp	bx,offset HDDF_ITEM
;R59 endif	;Support_4_IDE
;R59 
;R59 	@@:
;R59 		ret
;R59 Check_If_HDD_Type_Item	Endp

;R59 ;---------------------------------------------------------------------
;R59 ;input	:	BX = Item offset
;R59 ;
;R59 ;output	:	CY : not a HDD item: type, head., size...
;R59 ;
;R59 ;		NC : it is a HDD item
;R59 ;		     BX = HDD type item offset, e.g. offset HDDC_ITEM
;R59 ;		     SI = CMOS location for HDD type
;R59 ;		     DI = CMOS location for User define parameter
;R59 ;		     CH = CMOS location for LBA/CHS
;R59 ;		     CL = which bit in CH define LBA/CHS
;R59 ;		     ZF =  ZF: default type(0-46)
;R59 ;			   NZ: user type
;R59 ;
;R59 ;Destroy :	DX, SI, DI, FLAGS
;R59 ;---------------------------------------------------------------------
;R59 		Public	Get_HDD_CMOS_Info
;R59 Get_HDD_CMOS_Info	Proc	Near
;R59 
;R59 		push	ax
;R59 
;R59 ;--------------------------------
;R59 ;Check if BX is a HDD item or not
;R59 ;--------------------------------
;R59 
;R59 		cmp	bx,offset HDDC_ITEM
;R59 		jb	short Not_Hard_Drive_Item
;R59 
;R59 		cmp	bx,LAST_HDD_TYPE_ITEM+HDD_TYPE_DIFF
;R59 		jae	short Not_Hard_Drive_Item
;R59 
;R59 ;--------------------------------------------------
;R59 ;return DX = HDD type item offset
;R59 ;	SI = CMOS location for HDD type
;R59 ;	DI = CMOS location for User Type parameters
;R59 ;--------------------------------------------------
;R59 
;R59 ifdef	Support_4_IDE
;R59 		mov	di,DRV_50_CYL
;R59 		mov	si,offset HDDF_ITEM
;R59 	ifdef	IDE_LBA_MODE_SUPPORT
;R59 		mov	cx,7904h
;R59 	endif	;IDE_LBA_MODE_SUPPORT
;R59 		cmp	bx,si
;R59 		jae	short Chk_If_Size_Item
;R59 
;R59 		mov	di,DRV_51_CYL
;R59 		mov	si,offset HDDE_ITEM
;R59 	ifdef	IDE_LBA_MODE_SUPPORT
;R59 		mov	cx,7901h
;R59 	endif	;IDE_LBA_MODE_SUPPORT
;R59 		cmp	bx,si
;R59 		jae	short Chk_If_Size_Item
;R59 endif	;Support_4_IDE
;R59 
;R59 		mov	di,DRV_48_CYL
;R59 		mov	si,offset HDDD_ITEM
;R59 	ifdef	IDE_LBA_MODE_SUPPORT
;R59 		mov	cx,3C04h
;R59 	endif	;IDE_LBA_MODE_SUPPORT
;R59 		cmp	bx,si
;R59 		jae	short Chk_If_Size_Item
;R59 
;R59 		mov	di,DRV_49_CYL
;R59 		mov	si,offset HDDC_ITEM
;R59 	ifdef	IDE_LBA_MODE_SUPPORT
;R59 		mov	cx,3B04h
;R59 	endif	;IDE_LBA_MODE_SUPPORT
;R59 
;R59 Chk_If_Size_Item:
;R59 
;R59 		mov	dl,cs:[si].CmosLoc
;R59 		xor	dh,dh
;R59 		xchg	dx,si
;R59 
;R59 		mov	ax,dx
;R59 		add	ax,ITEM_SIZE			;point to HDD size
;R59 		cmp	bx,ax				;HDD size item?
;R59 		je	short Not_Hard_Drive_Item	;yes!
;R59 
;R59 	ifdef	IDE_LBA_MODE_SUPPORT
;R59 		add	ax,6*ITEM_SIZE			;point to LBA item
;R59 		cmp	bx,ax				;HDD LBA item?
;R59 		je	short Not_Hard_Drive_Item	;yes!
;R59 	endif	;IDE_LBA_MODE_SUPPORT
;R59 
;R59 ;--------------------------------
;R59 ;decide if it is user type or not
;R59 ;--------------------------------
;R59 
;R59 		xor	al,al				;indicates type 1-46
;R59 
;R59 ;R04		cmp	byte ptr [bp+si],46
;R59 		mov	ah,Post_Auto_type[bp]			;R04
;R59 		cmp	[bp+si],ah				;R04
;R59 		jbe	short HDD_Type_Not_User
;R59 
;R59 		mov	al,1			;indicates user type
;R59 
;R59 HDD_Type_Not_User:
;R59 
;R59 		or	al,al			;ZF: default type
;R59 						;NZ: user type
;R59 		pop	ax
;R59 		clc				;it is a HDD type(any type)
;R59 		ret
;R59 
;R59 Not_Hard_Drive_Item:
;R59 
;R59 		pop	ax
;R59 		stc				;it is not a HDD type item
;R59 		ret
;R59 Get_HDD_CMOS_Info	Endp

;R59 ;[]===========================================================[]
;R59 ;Input : BX - Point to any HDD parms items such as
;R59 ;	      cylinders, sectors, head ....
;R59 ;output: IF (BX == HDDC) or (BX == HDDD)
;R59 ;	  {
;R59 ;	   IF (HDD type >= 1) && (HDD type <= 47)
;R59 ;	     {
;R59 ;	      set the ITEMSTAT of the items related to be show-only
;R59 ;	     }
;R59 ;	   ELSE
;R59 ;	     {
;R59 ;	      set the ITEMSTAT of the items related to be
;R59 ;	      not show-only, i.e. editable
;R59 ;	     };
;R59 ;	   stc
;R59 ;	   ret
;R59 ;	  }
;R59 ;	 ELSE
;R59 ;	   {
;R59 ;	    call	Transfer_Hdd_Parms
;R59 ;	    clc
;R59 ;	   };
;R59 ;
;R59 ;[]===========================================================[]
;R59 Prg_HDD_Parms_Attr	Proc	Near
;R59 
;R59 		call	Check_If_HDD_Type_Item
;R59 		je	short HDD_Item_Yes
;R59 
;R59 		call	Transfer_Hdd_Parms
;R59 		clc
;R59 		ret
;R59 
;R59 ;-------------------------------
;R59 HDD_Item_Yes:
;R59 		call	Read_Item_Value
;R59 		cmp	dx,48
;R59 
;R59 ifndef Post_Auto_IDE_Detect				;R04
;R59 ifdef	IDE_LBA_MODE_SUPPORT
;R59 	mov	di,ITEMDISABLE
;R59 endif	;IDE_LBA_MODE_SUPPORT
;R59 endif ;Post_Auto_IDE_Detect				;R04
;R59 
;R59 		mov	dx,SHOWONLY
;R59 		jb	short Not_User_Type
;R59 		xor	dx,dx
;R59 ifdef	IDE_LBA_MODE_SUPPORT
;R59 ifndef Post_Auto_IDE_Detect				;R04
;R59 		xor	di,di
;R59 endif ;Post_Auto_IDE_Detect				;R04
;R59 		call	Chk_If_LBA_Mode		;LBA mode?
;R59 		je	short @F		;yes!
;R59 		call	Chk_If_LARGE_Mode	;LARGE mode?
;R59 		jne	short Not_User_Type	;no!
;R59 	@@:
;R59 		mov	dx,SHOWONLY
;R59 endif	;IDE_LBA_MODE_SUPPORT
;R59 
;R59 Not_User_Type:
;R59 		push	bx
;R59 		add	bx,ITEM_SIZE*2
;R59 		mov	cx,5
;R59 
;R59 Prg_HDD_Para_ItemStat:
;R59 
;R59 		call	Get_ItemStat_AX
;R59 		and	ax,not SHOWONLY
;R59 		or	ax,dx
;R59 		call	Set_ItemStat_AX
;R59 		add	bx,ITEM_SIZE
;R59 		loop	short Prg_HDD_Para_ItemStat
;R59 
;R59 ifdef IDE_LBA_MODE_SUPPORT
;R59 ifdef Post_Auto_IDE_Detect				;R04
;R59 		push	bx				;R04
;R59 		sub	bx,ITEM_SIZE*7			;R04
;R59 		call	Read_Item_Value			;R04
;R59 		xor	di,di				;R04
;R59 		cmp	dx,47				;R04
;R59 		jae	short @F			;R04
;R59 		mov	di,ITEMDISABLE			;R04
;R59 	@@:						;R04
;R59 		pop	bx				;R04
;R59 endif ;Post_Auto_IDE_Detect				;R04
;R59 		call	Get_ItemStat_AX
;R59 		and	ax,not ITEMDISABLE
;R59 		or	ax,di
;R59 		call	Set_ItemStat_AX
;R59 
;R59 		push	word ptr CURSOR_X[bp]
;R59 		push	word ptr HDD_CURSOR_FLG[bp]
;R59 
;R59 		mov	byte ptr HDD_CURSOR_FLG[bp],0ffh	;prevent recursive
;R59 		call	Display_Whole_Item
;R59 		or	di,di			;item disable?
;R59 		jz	short @F		;no
;R59 		mov	ax,word ptr [bx].Item_Xaxis
;R59 		mov	CURSOR_X[bp],ax
;R59 		call	VNORMAL
;R59 		mov	si,offset LBA_Dont_Care_Str
;R59 		call	Display_String
;R59 	@@:
;R59 		pop	word ptr HDD_CURSOR_FLG[bp]
;R59 		pop	word ptr CURSOR_X[bp]
;R59 endif ;IDE_LBA_MODE_SUPPORT
;R59 
;R59 		pop	bx
;R59 
;R59 		stc
;R59 		ret
;R59 Prg_HDD_Parms_Attr	Endp

;R59 ;[]===========================================================[]
;R59 ;Update_User_Type - 1. put parms for shown into corresponding
;R59 ;		       stack area & re-show HDD size
;R59 ;		    2. if Drive C = Drive D
;R59 ;		       re-show Drive C & Drive D
;R59 ;
;R59 ;Input : BX - Point to any HDD parms items such as
;R59 ;	      cylinders, sectors, head ....
;R59 ;Subroutine type : Post-Do
;R59 ;[]===========================================================[]
;R59 		Public	Update_User_Type
;R59 Update_User_Type	Proc	Near
;R59 
;R59 		pusha
;R59 
;R59 		cmp	al,Special_After
;R59 		jne	short Update_User_Type_Exit
;R59 
;R59 		call	Get_HDD_CMOS_Info
;R59 		jc	short Update_User_Type_Exit	;not HDD Item
;R59 		jz	short Update_User_Type_Exit	;not user type
;R59 
;R59 ;put parms for shown into corresponding stack area
;R59 
;R59 		mov	ax,CYLINDER[bp]
;R59 		mov	[bp+di+0],ax
;R59 
;R59 		mov	al,HEAD[bp]
;R59 		mov	[bp+di+2],al
;R59 
;R59 		mov	ax,PRECOMP[bp]
;R59 		mov	[bp+di+3],ax
;R59 
;R59 		mov	ax,LANDZONE[bp]
;R59 		mov	[bp+di+5],ax
;R59 
;R59 		mov	al,SECTOR[bp]
;R59 		mov	[bp+di+7],al
;R59 
;R59 		push	dx
;R59 		call	Transfer_Hdd_Parms
;R59 		pop	dx
;R59 		mov	bx,dx
;R59 		add	bx,ITEM_SIZE
;R59 		call	Display_Whole_Item		;Display HDD Size
;R59 
;R59 Update_User_Type_Exit:
;R59 
;R59 		popa
;R59 		clc
;R59 		ret
;R59 Update_User_Type	Endp

;R59 ;[]===========================================================[]
;R59 ;ReShow_HDD - show items including HDD type, sector, head
;R59 ;	      cylinder, precomp, landing zone & HDD size
;R59 ;
;R59 ;input - BX : HDD C or D
;R59 ;[]===========================================================[]
;R59 ReShow_HDD	proc	near
;R59 		push	ax			;save registers
;R59 		push	bx
;R59 		push	cx
;R59 
;R59 		call	Transfer_Hdd_Parms	;get all HDD parms
;R59 
;R59 ;R37		push	word ptr ATTRIBUTE[bp]	;save attribute
;R59 ;R37		push	word ptr CURSOR_X[bp]	;save cursor position
;R59 ;R37 - starts
;R59 .386
;R59 		push	dword ptr ATTRIBUTE[bp]
;R59 .286
;R59 ;R37 - ends
;R59 
;R59 		mov	cx,(HDD_TYPE_DIFF/ITEM_SIZE)-1
;R59 
;R59 Disp_Next_HDD_Item:
;R59 
;R59 		add	bx,ITEM_SIZE		;point to next item
;R59 		push	cx			;save counter
;R59 
;R59 ;[]-----------------------------------------------------------------------[]
;R59 ;  special treatment for Auto IDE Detection & HDD Low Level Format
;R59 ;  Input : byte ptr USE_ITEMSTAT_BUF[bp]=0 : Normal call
;R59 ;					 1 : call from routine: IDE_DETECT
;R59 ;					     add CURSOR_Y[bp],0
;R59 ;					 2 : call from routime: HDD_LFormat
;R59 ;					     add CURSOR_Y[bp],8
;R59 ;				    OTHERS : call from routine: IDE_DETECT
;R59 ;					     CURSOR_Y[bp] = USE_ITEMSTAT_BUF[bp]
;R59 ;[]-----------------------------------------------------------------------[]
;R59 		cmp	byte ptr USE_ITEMSTAT_BUF[bp],0	;normal call?
;R59 		je	short Normal_ReShow_HDD		;yes
;R59 
;R59 		call	Vnormal				;normal attribute
;R59 		call	Disp_ItemTitle
;R59 ifdef	Support_4_IDE					;R12
;R59 		mov	al,7				;R12
;R59 else	;Support_4_IDE					;R12
;R59 		mov	al,9				;cursor Y difference
;R59 endif	;Support_4_IDE					;R12
;R59 		cmp	byte ptr USE_ITEMSTAT_BUF[bp],2	;from HDD_LFormat?
;R59 		je	short @F			;yes
;R59 		xor	al,al				;cursor Y difference
;R59 
;R59 		cmp	byte ptr USE_ITEMSTAT_BUF[bp],1	;from IDE_DETECT?
;R59 		je	short @F			;yes
;R59 
;R59 		sub	byte ptr CURSOR_X[bp],5
;R59 		call	VReverse
;R59 
;R59 		mov	al,USE_ITEMSTAT_BUF[bp]		;cursor Y difference
;R59 		mov	byte ptr CURSOR_Y[bp],0		;use new CURSOR_Y
;R59 
;R59 @@:
;R59 		add	CURSOR_Y[bp],al			;use new CURSOR_Y
;R59 		call	Disp_ItemVar			;show Items
;R59 
;R59 		jmp	short @F
;R59 
;R59 Normal_ReShow_HDD:
;R59 ;---------------------------------------------------------------------------
;R59 		call	Display_Whole_Item		;display item
;R59 @@:
;R59 		pop	cx				;restore counter
;R59 		loop	short Disp_Next_HDD_Item	;show next
;R59 ;R37 - starts
;R59 .386
;R59 		pop	dword ptr ATTRIBUTE[bp]
;R59 .286
;R59 ;R37 - ends
;R59 ;R37		pop	word ptr CURSOR_X[bp]		;restore cursor position
;R59 ;R37		pop	word ptr ATTRIBUTE[bp]		;restore attribute
;R59 
;R59 		pop	cx				;restore registers
;R59 		pop	bx
;R59 		pop	ax
;R59 		ret
;R59 ReShow_HDD	endp

;R59 ;[]===========================================================[]
;R59 ;input : BX point to any HDD item
;R59 ;output: CYLINDER[bp]
;R59 ;	 HEAD[bp]
;R59 ;	 PRECOMP[bp]
;R59 ;	 LANDZONE[bp]
;R59 ;	 SECTOR[bp]
;R59 ;[]===========================================================[]
;R59 Transfer_Hdd_Parms	proc	near
;R59 
;R59 ;Clear all HDD parms in the first place
;R59 
;R59 		xor	ax,ax
;R59 		mov	CYLINDER[bp],ax
;R59 		mov	HEAD[bp],al
;R59 		mov	SECTOR[bp],al
;R59 		mov	PRECOMP[bp],ax
;R59 		mov	LANDZONE[bp],ax
;R59 
;R59 		push	si
;R59 ;R36 start
;R59 		mov	ax,cs
;R59 		cmp	ax,dgroup
;R59 		je	short @F
;R59 		jmp	Not_Hdd
;R59 @@:
;R59 ;R36 end
;R59 
;R59 		call	Get_HDD_CMOS_Info
;R59 		jnc	short @F
;R59 		jmp	Not_Hdd
;R59 	@@:
;R59 		jz	short Std_Hdd_Parm
;R59 
;R59 		mov	ax,[bp+di+0]		;transfer cylinder no.
;R59 		mov	CYLINDER[bp],ax
;R59 
;R59 		mov	al,[bp+di+2]		;transfer head no.
;R59 		mov	HEAD[bp],al
;R59 
;R59 		mov	ax,[bp+di+3]		;transfer precomp
;R59 		mov	PRECOMP[bp],ax
;R59 
;R59 		mov	ax,[bp+di+5]		;transfer landing zone
;R59 		mov	LANDZONE[bp],ax
;R59 
;R59 		mov	al,[bp+di+7]		;transfer sector no.
;R59 		mov	SECTOR[bp],al
;R59 
;R59 ifdef IDE_LBA_MODE_SUPPORT
;R59 		call	Chk_If_LARGE_Mode		;LARGE mode now?
;R59 		mov	si,offset Tran_CHS_LARGE
;R59 		je	short Trans_LBA_LARGE		;yes!
;R59 
;R59 		call	Chk_If_LBA_Mode			;LBA mode now?
;R59 		jne	short No_LBA_LARGE		;no, skip!
;R59 		mov	si,offset Tran_CHS_LBA		;routine to call
;R59 		mov	word ptr PRECOMP[bp],0
;R59 Trans_LBA_LARGE:
;R59 		push	bx
;R59 		mov	bx,CYLINDER[bp]
;R59 		mov	al,SECTOR[bp]
;R59 		mov	ah,HEAD[bp]
;R59 		POST_func_call	si
;R59 		mov	CYLINDER[bp],bx
;R59 		mov	SECTOR[bp],al
;R59 		mov	HEAD[bp],ah
;R59 		pop	bx
;R59 No_LBA_LARGE:
;R59 endif ;IDE_LBA_MODE_SUPPORT
;R59 
;R59 	  	jmp	short Move_Exit
;R59 
;R59 ;-------------------
;R59 ;transfer type 1-47
;R59 ;-------------------
;R59 
;R59 Std_Hdd_Parm:
;R59 ifndef	Skip_HDD_Type_1_To_46						;R08A
;R59 		cmp	byte ptr [bp+si],0	;Hard disk exist?
;R59 		je	short Move_Exit
;R59 else	;Skip_HDD_Type_1_To_46						;R08A
;R59 		cmp	byte ptr [bp+si],47	;Hdd type 0 or auto?	;R08A
;R59 		jbe	short Move_Exit					;R08A
;R59 endif	;Skip_HDD_Type_1_To_46						;R08A
;R59 
;R59 		push	bx
;R59 		mov	al,[bp+si]		;Hdd type no.
;R59 		xor	ah,ah
;R59 		dec	ax
;R59 		mov	cl,HDP_SIZE
;R59 		mul	cl
;R59 
;R59 		mov	bx,offset cs:HDISK_PARMS
;R59 		add	bx,ax
;R59 
;R59 		mov	ax,cs:[bx].MaxCyl
;R59 		mov	CYLINDER[bp],ax
;R59 		mov	al,cs:[bx].MaxHead
;R59 		mov	HEAD[bp],al
;R59 		mov	al,cs:[bx].MaxSector
;R59 		mov	SECTOR[bp],al
;R59 
;R59 		mov	ax,cs:[bx].MaxPreComp
;R59 		mov	PRECOMP[bp],ax
;R59 		mov	ax,cs:[bx].MaxLandZone
;R59 		mov	LANDZONE[bp],ax
;R59 		pop	bx
;R59 
;R59 Move_Exit:
;R59 ;-------------------
;R59 ;calculate HDD size
;R59 ;-------------------
;R59 
;R59 		push	cx
;R59 ;R28		mov	ax,CYLINDER[bp]
;R59 		xor	ah,ah					;R28
;R59 		mov	al,HEAD[bp]				;R28
;R59 		xor	ch,ch
;R59 ;R28		mov	cl,HEAD[bp]
;R59 ;R28		mul	cx
;R59 		mov	cl,SECTOR[bp]
;R59 ;R28		shl	cx,3					;R13
;R59 		shl	cx,2					;R28
;R59 		mul	cx
;R59 		mul	word ptr CYLINDER[bp]			;R28
;R59 ;R13		mov	cx,2048
;R59 ;R28		mov	cx,15625				;R13
;R59 		mov	cx,15625/2				;R28
;R59 		div	cx
;R59 		mov	HDDSIZE[bp],ax
;R59 		pop	cx
;R59 
;R59 Not_Hdd:
;R59 		pop	si
;R59 		ret
;R59 
;R59 Transfer_Hdd_Parms	endp
;R59 
;R59 ;[]===========================================================[]
;R59 ;[]===========================================================[]
;R59 Check_Valid_HDD_Type	Proc	Near
;R59 ;R03 Chk_DrvC:
;R59 ;R03 		mov	si,CMOS19
;R59 ;R03 		cmp	byte ptr CMOS19[bp],47
;R59 ;R03 		jne	short @F
;R59 ;R03 		call	Invalid_HDD
;R59 ;R03 		jmp	short Chk_DrvD
;R59 ;R03 	@@:
;R59 ;R03 		cmp	byte ptr CMOS19[bp],48
;R59 ;R03 		jne	short Chk_DrvD
;R59 ;R03 		call	Invalid_HDD
;R59 ;R03 Chk_DrvD:
;R59 ;R03 		mov	si,CMOS1A
;R59 ;R03 		cmp	byte ptr CMOS1A[bp],47
;R59 ;R03 		jne	short @F
;R59 ;R03 		call	Invalid_HDD
;R59 ;R03 		jmp	short Check_Valid_Exit
;R59 ;R03 	@@:
;R59 ;R03 		cmp	byte ptr CMOS1A[bp],49
;R59 ;R03 		jne	short Check_Valid_Exit
;R59 ;R03 		call	Invalid_HDD
;R59 ;R03 Check_Valid_Exit:
;R59 ;R03 		ret
;R59 ;R03 
;R59 ;R03 Invalid_HDD:
;R59 ;R03 		mov	byte ptr [bp+si],0
;R59 
;R59 ;R03 - start
;R59 		mov	si,offset HDD_Type_Cmos
;R59 		mov	di,offset Skip_HDD_Type_Tbl
;R59 		mov	cx,NUM_OF_IDE_ITEM		;number of HDD to do
;R59 
;R59 Next_Hdd_Drive:		
;R59 
;R59 		push	di
;R59 		push	si
;R59 		push	cx
;R59 
;R59 		mov	si,cs:[si]
;R59 		and	si,00ffH			;use byte only
;R59 
;R59 		mov	al,byte ptr [bp+si]
;R59 
;R59 		cmp	al,51				;invalid HDD type
;R59 		ja	short Invalid_HDD
;R59 
;R59 		mov	cx,NO_OF_SKIP_HDD
;R59 Next_Invalid_Hdd:
;R59 		cmp	al,cs:[di]
;R59 		je	short Invalid_HDD
;R59 		inc	di
;R59 		loop	short Next_Invalid_Hdd
;R59 		jmp	short Check_Next_Invalid
;R59 
;R59 Invalid_HDD:
;R59 		mov	byte ptr [bp+si],0
;R59 Check_Next_Invalid:
;R59 
;R59 		pop	cx
;R59 		pop	si
;R59 		pop	di
;R59 		add	di,NO_OF_SKIP_HDD
;R59 		inc	si
;R59 		loop	short Next_Hdd_Drive
;R59 ;R03 - end
;R59 
;R59 		ret
;R59 
;R59 Check_Valid_HDD_Type	Endp

;R59 ;[]===========================================================[]
;R59 ;[]===========================================================[]
;R59 Move_HDD_Cursor	Proc	Near
;R59 
;R59 ;------------------------------------------------------------
;R59 ;Try to move the KEYIN_ITEM_OFF[bp] according to LAST_KEY[bp]
;R59 ;------------------------------------------------------------
;R59 
;R59 		mov	di,LAST_KEY[bp]
;R59 		mov	ax,KEYIN_ITEM_OFF[bp]
;R59 
;R59 ;------------------------------------------------------------------------
;R59 Try_Move_HDD_LA:
;R59 
;R59 		cmp	di,LEFT_ARROW		;input key = LEFT_ARROW ?
;R59 		jne	short Try_Move_HDD_RA	;no, try next!
;R59 
;R59 		mov	bx,ax
;R59 
;R59 ifdef	IDE_LBA_MODE_SUPPORT
;R59 		pusha
;R59 		mov	ax,OLDITEM[bp]
;R59 		cmp	ax,KEYIN_ITEM_OFF[bp]
;R59 		popa
;R59 		je	short TRY_LA_1
;R59 endif	;IDE_LBA_MODE_SUPPORT
;R59 
;R59 		call	Move_Cursor		;check where will KEYIN_ITEM go
;R59 
;R59 		call	Check_If_HDD_Type_Item	;does KEYIN_ITEM go to HDD type item?
;R59 		jne	short Only_KEYIN_Moves	;no, so only KEYIN item moves
;R59 
;R59 	TRY_LA_1:
;R59 
;R59 		call	Up_Line			;if go up...
;R59 
;R59 		mov	bx,si
;R59 		call	Check_If_HDD_Type_Item	;does Up_Line cause bx to go to HDD type item?
;R59 		je	short KEYIN_OLD_Together;yes, put KEYIN & OLITEM together
;R59 
;R59 		mov	bx,si			;go up --> HOUR item
;R59 		call	Go_Most_Right_Item	;so, according to AMI's setup,
;R59 		mov	bx,si
;R59 		jmp	short KEYIN_OLD_Together;go to SECOND item
;R59 
;R59 ;------------------------------------------------------------------------
;R59 Try_Move_HDD_RA:
;R59 		cmp	di,K_CR1		;input key = ENTER ?
;R59 		je	short RA_Cont		;yes, continue
;R59 		cmp	di,RIGHT_ARROW		;input key = RIGHT_ARROW ?
;R59 		jne	short Try_Move_HDD_UA	;no, try next
;R59 	RA_Cont:
;R59 		mov	bx,ax
;R59 		call	Move_Cursor		;check where will KEYIN_ITEM go
;R59 
;R59 		call	Check_If_HDD_Type_Item	;KEYIN_ITEM go to next HDD type item?
;R59 		je	short @F		;yes, so put KEYIN & OLITEM together
;R59 
;R59 ifdef	IDE_LBA_MODE_SUPPORT
;R59 		call	Check_If_LBA_Item
;R59 		je	short @F
;R59 endif	;IDE_LBA_MODE_SUPPORT
;R59 
;R59 		cmp	bx,LAST_HDD_ITEM	;KEYIN_ITEM go to HDD para. item?
;R59 		jbe	short Only_KEYIN_Moves	;yes, so only KEYIN item moves
;R59 	@@:
;R59 		jmp	short KEYIN_OLD_Together;put KEYIN & OLITEM together
;R59 
;R59 ;------------------------------------------------------------------------
;R59 Try_Move_HDD_UA:
;R59 
;R59 		cmp	di,UP_ARROW		;input key = UP_ARROW ?
;R59 		jne	short Try_Move_HDD_DA	;no, try next
;R59 
;R59 		mov	bx,OLDITEM[bp]		;OLITEM[bp] = HDD type item
;R59 		jmp	short TRY_LA_1
;R59 
;R59 ;------------------------------------------------------------------------
;R59 Try_Move_HDD_DA:
;R59 
;R59 		cmp	di,DOWN_ARROW		;input key = DOWN_ARROW ?
;R59 		je	short @F		;yes, continue
;R59 		clc
;R59 		ret				;exit
;R59 	@@:
;R59 		mov	bx,OLDITEM[bp]		;OLITEM[bp] = HDD type item
;R59 		call	Down_Line		;OLITEM go down and put
;R59 		mov	bx,si
;R59 						;  KEYIN & OLITEM together
;R59 
;R59 ;------------------------------------------------------------------------
;R59 KEYIN_OLD_Together:
;R59 
;R59 		call	ReDisp_KEYIN
;R59 
;R59 		cmp	OLDITEM[bp],bx
;R59 		je	short @F
;R59 		xchg	OLDITEM[bp],bx
;R59 		call	Display_Whole_Item
;R59 		mov	bx,OLDITEM[bp]
;R59 	@@:
;R59 		jmp	short Move_HDD_Exit0
;R59 
;R59 ;------------------------------------------------------------------------
;R59 Only_KEYIN_Moves:
;R59 		call	ReDisp_KEYIN
;R59 		mov	bx,OLDITEM[bp]
;R59 
;R59 ;------------------------------------------------------------------------
;R59 Move_HDD_Exit0:
;R59 		mov	byte ptr HDD_CURSOR_FLG[bp],0
;R59 		jmp	Destroy_Key_Then_Ret
;R59 
;R59 Move_HDD_Cursor	Endp
;R59 
;R59 ReDisp_KEYIN:
;R59 		mov	byte ptr HDD_CURSOR_FLG[bp],0ffh
;R59 		pusha
;R59 		push	word ptr OLDITEM[bp]		;R07
;R59 		xchg	KEYIN_ITEM_OFF[bp],bx
;R59 		call	Check_If_HDD_Type_Item		;R07
;R59 		jne	short @F			;R07
;R59 		mov	byte ptr HDD_CURSOR_FLG[bp],0	;R07
;R59 		mov	word ptr OLDITEM[bp],-1		;R07
;R59 	@@:						;R07
;R59 		call	Display_Whole_Item
;R59 		pop	word ptr OLDITEM[bp]		;R07
;R59 		popa
;R59 		ret
;R59 
;R59 ;[]===========================================================[]
;R59 ;[]===========================================================[]
;R59 Show_HDD_Cursor	Proc	Near
;R59 		push	bx
;R59 
;R59 		mov	si,Color_Offset[bp]
;R59 		mov	dl,[si].CREVERSE
;R59 		cmp	byte ptr ATTRIBUTE[bp],dl
;R59 		jne	short Show_HDD_Cursor_End
;R59 
;R59 		mov	bx,OLDITEM[bp]
;R59 		cmp	bx,KEYIN_ITEM_OFF[bp]		;KEYIN_ITEM=OLDITEM?
;R59 		je	short Seperate_Cursor		;yes, try to seperate
;R59 
;R59 ;---------------------------------------------------------------------------
;R59 Merge_Cursor:
;R59 
;R59 		call	Get_HDD_CMOS_Info
;R59 		jnz	short Show_HDD_Cursor_End	;NZ = user type
;R59 
;R59 		mov	KEYIN_ITEM_OFF[bp],dx
;R59 		jmp	short Show_HDD_Cursor_End
;R59 
;R59 ;---------------------------------------------------------------------------
;R59 Seperate_Cursor:
;R59 
;R59 		call	Get_HDD_CMOS_Info
;R59 		jz	short Show_HDD_Cursor_End	;ZF = type 0-46
;R59 
;R59 		call	Check_If_HDD_Type_Item
;R59 
;R59 		pushf
;R59 		mov	OLDITEM[bp],dx
;R59 		mov	bx,dx
;R59 		call	Reverse_It
;R59 
;R59 	ifdef	IDE_LBA_MODE_SUPPORT
;R59 		mov	KEYIN_ITEM_OFF[bp],bx
;R59 		call	Chk_If_LBA_Mode			;LBA mode ?
;R59 		je	short @F			;yes
;R59 		call	Chk_If_LARGE_Mode		;LARGE mode?
;R59 		je	short @F			;yes
;R59 	endif	;IDE_LBA_MODE_SUPPORT
;R59 
;R59 		add	bx,ITEM_SIZE*2
;R59 		mov	KEYIN_ITEM_OFF[bp],bx
;R59 		call	Reverse_It
;R59 @@:
;R59 		popf
;R59 		je	short Cur_In_HDD_Type
;R59 
;R59 		pop	ax				;abandon original BX
;R59 		stc
;R59 		ret
;R59 
;R59 Cur_In_HDD_Type:
;R59 Show_HDD_Cursor_End:
;R59 
;R59 		pop	bx
;R59 		clc
;R59 		ret
;R59 
;R59 Reverse_It:
;R59 		mov	byte ptr HDD_CURSOR_FLG[bp],0ffh
;R59 		call	Vnormal
;R59 		push	word ptr CURSOR_X[bp]
;R59 		call	Disp_ItemTitle
;R59 		call	VReverse
;R59 		call	Disp_ItemVar
;R59 		pop	word ptr CURSOR_X[bp]
;R59 		mov	byte ptr HDD_CURSOR_FLG[bp],0
;R59 		ret
;R59 
;R59 Show_HDD_Cursor	Endp

;R59 ifdef	IDE_LBA_MODE_SUPPORT
;R59 Do_LBA		Proc	Near
;R59 
;R59 		cmp	al,Special_Before
;R59 		je	short Do_LBA_Before
;R59 
;R59 		pusha
;R59 		call	Get_HDD_CMOS_Info
;R59 		mov	bx,dx
;R59 		call	Prg_HDD_Parms_Attr
;R59 		call	ReShow_HDD
;R59 		popa
;R59 
;R59 	Do_LBA_Exit:
;R59 
;R59 		clc
;R59 		ret
;R59 
;R59 Do_LBA_Before:
;R59 		cmp	word ptr LAST_KEY[bp],LEFT_ARROW
;R59 		jne	short Try_Do_LBA_UP
;R59 		call	Get_HDD_CMOS_Info
;R59 		mov	OLDITEM[bp],dx
;R59 		sub	bx,ITEM_SIZE
;R59 		CHK_ITEMSTAT SHOWONLY
;R59 		jz	@F
;R59 		mov	bx,dx
;R59 		jmp	KEYIN_OLD_Together
;R59 	@@:
;R59 		jmp	Only_KEYIN_Moves
;R59 Try_Do_LBA_UP:
;R59 		cmp	word ptr LAST_KEY[bp],UP_ARROW
;R59 		jne	short Try_Do_LBA_DOWN
;R59 		jmp	Move_HDD_CURSOR
;R59 Try_Do_LBA_DOWN:
;R59 		cmp	word ptr LAST_KEY[bp],DOWN_ARROW
;R59 		jne	short Do_LBA_Exit
;R59 		jmp	Move_HDD_CURSOR
;R59 
;R59 Do_LBA		Endp
;R59 
;R59 		Public	Chk_If_LARGE_Mode
;R59 Chk_If_LARGE_Mode:
;R59 		mov	al,2
;R59 		jmp	short Detect_LBA_LARGE
;R59 
;R59 ;input : bx = hdd item offset
;R59 ;output: zf = 1 disable
;R59 ;	 zf = 0 enable
;R59 		Public	Chk_If_LBA_Mode
;R59 Chk_If_LBA_Mode:
;R59 		mov	al,1
;R59 
;R59 Detect_LBA_LARGE:
;R59 
;R59 		pusha
;R59 		call	Get_HDD_CMOS_Info
;R59 
;R59 		mov	bx,dx
;R59 		add	bx,HDD_TYPE_DIFF-ITEM_SIZE
;R59 		push	ax
;R59 		call	Read_Item_Value
;R59 		pop	ax
;R59 		cmp	dl,al
;R59 
;R59 		popa
;R59 		ret
;R59 
;R59 endif	;IDE_LBA_MODE_SUPPORT

FCODE		ENDS

;R58 - starts
.386p
		extrn	DISP_DWORD_INT6:near
		extrn	F000_call_Proc:Near

XGROUP		GROUP	XCODE
XCODE		SEGMENT USE16 PARA PUBLIC 'XCODE'
		ASSUME	CS:XGROUP,ES:XGROUP

fPROC_Show_Mem_Info	Proc	Far
		pushad
		push	ds

		push	cs
		pop	ds
		mov	si, offset Disp_Mem_Tbl
	@@:
		lodsw
		push	si
		mov	si, ax
		extrn	x_Display_String:near
		call	x_Display_String
		pop	si

		lodsb
		push	si
		movzx	cx, al
ifdef	SPECIAL_SHARE_MEMORY_SHOW				;R65 - satrts
		cmp	al,READ_BASE
		jz	short	Not_Add_MEM
		cmp	al,READ_OTHER
		jz	short	Not_Add_MEM
		F000_call Read_Memory
		push	eax
		F000_call Ct_Share_Memory_Size	;get shared mem. size	
		xor	ecx,ecx						
		mov	cx, ax						
		pop	eax
		add	eax, ecx					
		jmp	short Add_MEM_End
	Not_Add_MEM:
		F000_call Read_Memory
Add_MEM_End:
else	;SPECIAL_SHARE_MEMORY_SHOW				;R65 - ends
		F000_call Read_Memory
endif	;SPECIAL_SHARE_MEMORY_SHOW				;R65
		F000_call DISP_DWORD_INT6
		pop	si

		cmp	si, offset Disp_Mem_Tbl_End
		jb	short @B

		pop	ds
		popad
		retf

fPROC_Show_Mem_Info	Endp

Disp_Mem_Tbl	Label	Near
		dw	offset Base_Mem_Str
		db	READ_BASE
		dw	offset Ext_Mem_Str
		db	READ_EXT
		dw	offset Other_Mem_Str
		db	READ_OTHER
		dw	offset Total_Mem_Str
		db	READ_TOTAL
Disp_Mem_Tbl_End	Label	Near

;-----------------------------
	MEMORY_X	=	47
	MEMORY_Y	=	14
ifdef	Support_4_IDE
	MEMORY_Y	=	16
endif	;Support_4_IDE

Base_Mem_Str:
		POS	<,MEMORY_X+4,MEMORY_Y>
		db	'Base'
		JMPSTRING <,offset Mem_K_Str>

;-----------------------------
MEMORY_Y	=	MEMORY_Y + 1
Ext_Mem_Str:
		POS	<,MEMORY_X,MEMORY_Y>
		db	'Extended'
		JMPSTRING <,offset Mem_K_Str>
;-----------------------------
MEMORY_Y	=	MEMORY_Y + 1
Other_Mem_Str:
		POS	<,MEMORY_X+3,MEMORY_Y>
		db	'Other'
		JMPSTRING <,offset Mem_K_Str>

;-----------------------------
MEMORY_Y = MEMORY_Y + 2
TOTAL_MEM_Y		EQU	MEMORY_Y - 1
Total_Mem_Str:
		BORDER1	<,47,TOTAL_MEM_Y,70,TOTAL_MEM_Y,0>
		ADDY	<,1>
		SUBX	<,20>
		db	'Total'
Mem_K_Str	db	' Memory:'
		ADDX	<,7>
		db	'K'
		SUBX	<,8>
		db	0

;R59 - starts
;[]===========================================================[]
;[]===========================================================[]
		Public	X_Do_HDD
X_Do_HDD	Proc	Near

		pusha

		cmp	al, Special_After
		je	short Do_Post_HDD

;---------------------------------------------------------------------
Do_Pre_HDD:
		call	X_Move_HDD_Cursor
		call	X_Read_Item_Value
		mov	LAST_HDD_TYPE[bp], dl
		jmp	short Do_HDD_Exit

;---------------------------------------------------------------------
Do_Post_HDD:
		call	X_Skip_HDD_Type
		call	X_Prg_HDD_Parms_Attr

		push	word ptr CMOS19[bp]
		F000_call Set_CMOS12h
		pop	word ptr CMOS19[bp]

Do_HDD_Exit:
		popa
		clc
		ret

X_Do_HDD	Endp

;[]===========================================================[]
;[]===========================================================[]
		Public	X_Show_HDD
X_Show_HDD	Proc	Near

;-----------------
;Before_Show_HDD:
;-----------------
		cmp	al, Special_Before
		jne	short After_Show_HDD


ifdef	Skip_HDD_Type_1_To_46
		call	X_Check_If_HDD_Type_Item
		jne	short @F
		call	X_Skip_HDD_Type
	@@:
endif	;Skip_HDD_Type_1_To_46


		cmp	byte ptr HDD_CURSOR_FLG[bp], 0ffh
		je	short @F

		push	word ptr ATTRIBUTE[bp]
		call	X_Prg_HDD_Parms_Attr	;program the ITEMSTAT of cyl, head...
		jnc	short Skip_ReShow_HDD	;ITEMSTATs not changed
		call	X_ReShow_HDD
Skip_ReShow_HDD:
		pop	word ptr ATTRIBUTE[bp]
		call	X_Show_HDD_Cursor
	@@:
		ret

;-----------------
After_Show_HDD:
;-----------------
		call	X_Check_If_HDD_Type_Item
		jne	short Show_User_Exit
;R68 Show_User:
;R68 start
		mov	al,'M'
		cmp	byte ptr HDDSIZE_Unit[bp],HDDSIZE_MB
		jbe	short @F
		mov	al,'G'
@@:
		push	word ptr ATTRIBUTE[bp]
		push	word ptr CURSOR_X[bp]
		add	byte ptr CURSOR_X[bp],8
		f000_call	Vnormal
		call	X_Display_Char
		pop	word ptr CURSOR_X[bp]
		pop	word ptr ATTRIBUTE[bp]
;R68 end
		call	X_Read_Item_Value
		mov	si, offset None_Str
		or	dx, dx
		jz	short @F
		cmp	dx, 48
		mov	si, offset User_Str
		jae	short @F
ifdef Post_Auto_IDE_Detect
		cmp	dx, 47
		mov	si, offset Auto_Str
		je	short @F
endif ;Post_Auto_IDE_Detect
		ret
	@@:
		sub	byte ptr CURSOR_X[bp], 4
		call	X_Display_String
Show_User_Exit:
		ret

X_Show_HDD	Endp

ifdef	IDE_LBA_MODE_SUPPORT
;-------------------------------------------
;-------------------------------------------
		Public	X_Check_If_LBA_Item
X_Check_If_LBA_Item	Proc	Near
		pushad
		call	X_Get_HDD_CMOS_Info
		add	dx, HDD_TYPE_DIFF-ITEM_SIZE	;point LBA item
		cmp	bx, dx
		popad
		ret
X_Check_If_LBA_Item	Endp
endif	;IDE_LBA_MODE_SUPPORT

		Public	X_Skip_HDD_Type
X_Skip_HDD_Type	Proc	Near

		call	X_Read_Item_Value

		xor	ax, ax
		jmp	short @F

Skip_This_HDD:
		mov	ax, 1
		cmp	word ptr LAST_KEY[bp], PGDN
		je	short @F
		cmp	word ptr LAST_KEY[bp], K_PLUS
		je	short @F
		mov	ax, -1
		cmp	word ptr LAST_KEY[bp], PGUP
		je	short @F
		cmp	word ptr LAST_KEY[bp], K_MINUS
		je	short @F
		mov	ax, 1
	@@:
		add	dx, ax

ifdef	Skip_HDD_Type_1_To_46
		or	dl, dl
		jz	short @F
		cmp	dl, 46
		jbe	short Skip_This_HDD
	@@:
endif	;Skip_HDD_Type_1_To_46
		cmp	dl, 46
		je	short Skip_This_HDD

		mov	cx, NO_OF_SKIP_HDD
		mov	di, offset Skip_HDD_Type_Tbl
		cmp	bx, offset HDDC_ITEM
		je	short @F
		add	di, cx

ifdef	Support_4_IDE
		cmp	bx, offset HDDD_ITEM
		je	short @F
		add	di, cx
		cmp	bx, offset HDDE_ITEM
		je	short @F
		add	di, cx
endif	;Support_4_IDE

	@@:
		cmp	dl, cs:[di]
		je	short Skip_This_HDD
		inc	di
		loop	@B

		call	X_Write_Item_Value
		ret

X_Skip_HDD_Type	Endp

;[]===========================================================[]
;[]===========================================================[]
Skip_HDD_Type_Tbl:

ifdef	Support_4_IDE

	ifdef Post_Auto_IDE_Detect
		db	15, 48, 50, 51
		db	15, 49, 50, 51
		db	15, 48, 49, 50
		db	15, 48, 49, 51
	else ;Post_Auto_IDE_Detect
		db	15, 47, 48, 50, 51	;drive C skip these options
		db	15, 47, 49, 50, 51	;drive D skip these options
		db	15, 47, 48, 49, 50	;drive E skip these options
		db	15, 47, 48, 49, 51	;drive F skip these options
	endif ;Post_Auto_IDE_Detect

else	;Support_4_IDE

	ifdef Post_Auto_IDE_Detect
		db	15, 48
		db	15, 49
	else ;Post_Auto_IDE_Detect
		db	15, 47, 48	;drive C skip these options
		db	15, 47, 49	;drive D skip these options
	endif ;Post_Auto_IDE_Detect

endif	;Support_4_IDE

NO_OF_SKIP_HDD	EQU	($ - offset Skip_HDD_Type_Tbl)/NUM_OF_IDE_ITEM

HDD_Type_Cmos:
		db	CMOS19		;Drive 0
		db	CMOS1A		;Drive 1
		db	67H		;Drive 2
		db	70H		;Drive 3

;-------------------------------------------
;-------------------------------------------
		Public	X_Check_If_HDD_Type_Item
X_Check_If_HDD_Type_Item	Proc	Near

		cmp	bx, offset HDDC_ITEM
		je	short @F
		cmp	bx, offset HDDD_ITEM

ifdef	Support_4_IDE
		je	short @F
		cmp	bx, offset HDDE_ITEM
		je	short @F
		cmp	bx, offset HDDF_ITEM
endif	;Support_4_IDE

	@@:
		ret

X_Check_If_HDD_Type_Item	Endp

;---------------------------------------------------------------------
;input	:	BX = Item offset
;
;output	:	CY : not a HDD item: type, head., size...
;
;		NC : it is a HDD item
;		     DX = HDD type item offset, e.g. offset HDDC_ITEM
;		     SI = CMOS location for HDD type
;		     DI = CMOS location for User define parameter
;		     CH = CMOS location for LBA/CHS
;		     CL = which bit in CH define LBA/CHS
;		     ZF =  ZF: default type(0-46)
;			   NZ: user type
;
;Destroy :	DX, SI, DI, FLAGS
;---------------------------------------------------------------------
		Public	fPROC_Get_HDD_CMOS_Info
fPROC_Get_HDD_CMOS_Info	Proc	Far
		call	X_Get_HDD_CMOS_Info
		ret
fPROC_Get_HDD_CMOS_Info	Endp
		Public	X_Get_HDD_CMOS_Info
X_Get_HDD_CMOS_Info	Proc	Near

		push	ax

;--------------------------------
;Check if BX is a HDD item or not
;--------------------------------

		cmp	bx, offset HDDC_ITEM
		jb	short Not_Hard_Drive_Item

		cmp	bx, LAST_HDD_TYPE_ITEM+HDD_TYPE_DIFF
		jae	short Not_Hard_Drive_Item

;--------------------------------------------------
;return DX = HDD type item offset
;	SI = CMOS location for HDD type
;	DI = CMOS location for User Type parameters
;--------------------------------------------------

ifdef	Support_4_IDE
		mov	di, DRV_50_CYL
		mov	si, offset HDDF_ITEM
	ifdef	IDE_LBA_MODE_SUPPORT
		mov	cx, 7904h
	endif	;IDE_LBA_MODE_SUPPORT
		cmp	bx, si
		jae	short Chk_If_Size_Item

		mov	di, DRV_51_CYL
		mov	si, offset HDDE_ITEM
	ifdef	IDE_LBA_MODE_SUPPORT
		mov	cx, 7901h
	endif	;IDE_LBA_MODE_SUPPORT
		cmp	bx, si
		jae	short Chk_If_Size_Item
endif	;Support_4_IDE

		mov	di, DRV_48_CYL
		mov	si, offset HDDD_ITEM
	ifdef	IDE_LBA_MODE_SUPPORT
		mov	cx, 3C04h
	endif	;IDE_LBA_MODE_SUPPORT
		cmp	bx, si
		jae	short Chk_If_Size_Item

		mov	di, DRV_49_CYL
		mov	si, offset HDDC_ITEM
	ifdef	IDE_LBA_MODE_SUPPORT
		mov	cx, 3B04h
	endif	;IDE_LBA_MODE_SUPPORT

Chk_If_Size_Item:
		push	ds
		mov	ax, SEG DGROUP
		mov	ds, ax
		mov	dl, ds:[si].CmosLoc
		pop	ds
		xor	dh, dh
		xchg	dx, si

		mov	ax, dx
		add	ax, ITEM_SIZE			;point to HDD size
		cmp	bx, ax				;HDD size item?
		je	short Not_Hard_Drive_Item	;yes!

	ifdef	IDE_LBA_MODE_SUPPORT
		add	ax, 6*ITEM_SIZE			;point to LBA item
		cmp	bx, ax				;HDD LBA item?
		je	short Not_Hard_Drive_Item	;yes!
	endif	;IDE_LBA_MODE_SUPPORT

;--------------------------------
;decide if it is user type or not
;--------------------------------

		xor	al, al				;indicates type 1-46

		mov	ah, Post_Auto_type[bp]
		cmp	[bp+si], ah
		jbe	short HDD_Type_Not_User

		mov	al, 1			;indicates user type

HDD_Type_Not_User:

		or	al, al			;ZF: default type
						;NZ: user type
		pop	ax
		clc				;it is a HDD type(any type)
		ret

Not_Hard_Drive_Item:

		pop	ax
		stc				;it is not a HDD type item
		ret

X_Get_HDD_CMOS_Info	Endp

;[]===========================================================[]
;Input : BX - Point to any HDD parms items such as
;	      cylinders, sectors, head ....
;output: IF (BX == HDDC) or (BX == HDDD)
;	  {
;	   IF (HDD type >= 1) && (HDD type <= 47)
;	     {
;	      set the ITEMSTAT of the items related to be show-only
;	     }
;	   ELSE
;	     {
;	      set the ITEMSTAT of the items related to be
;	      not show-only, i.e. editable
;	     };
;	   stc
;	   ret
;	  }
;	 ELSE
;	   {
;	    call	Transfer_Hdd_Parms
;	    clc
;	   };
;
;[]===========================================================[]
X_Prg_HDD_Parms_Attr	Proc	Near

		call	X_Check_If_HDD_Type_Item
		je	short HDD_Item_Yes

		call	X_Transfer_Hdd_Parms
		clc
		ret

;-------------------------------
HDD_Item_Yes:
		call	X_Read_Item_Value
		cmp	dx, 48

ifndef Post_Auto_IDE_Detect
ifdef	IDE_LBA_MODE_SUPPORT
	mov	di, ITEMDISABLE
endif	;IDE_LBA_MODE_SUPPORT
endif ;Post_Auto_IDE_Detect

		mov	dx, SHOWONLY
		jb	short Not_User_Type
		xor	dx, dx
ifdef	IDE_LBA_MODE_SUPPORT
ifndef Post_Auto_IDE_Detect
		xor	di, di
endif ;Post_Auto_IDE_Detect
		call	X_Chk_If_LBA_Mode		;LBA mode?
		je	short @F		;yes!
		call	X_Chk_If_LARGE_Mode	;LARGE mode?
		jne	short Not_User_Type	;no!
	@@:
		mov	dx, SHOWONLY
endif	;IDE_LBA_MODE_SUPPORT

Not_User_Type:
		push	bx
		add	bx, ITEM_SIZE*2
		mov	cx, 5

Prg_HDD_Para_ItemStat:

		call	X_Get_ItemStat_AX
		and	ax, not SHOWONLY
		or	ax, dx
		call	X_Set_ItemStat_AX
		add	bx, ITEM_SIZE
		loop	short Prg_HDD_Para_ItemStat

ifdef IDE_LBA_MODE_SUPPORT
ifdef Post_Auto_IDE_Detect
		push	bx
		sub	bx, ITEM_SIZE*7
		call	X_Read_Item_Value
		xor	di, di
		cmp	dx, 47
		jae	short @F
		mov	di, ITEMDISABLE
	@@:
		pop	bx
endif ;Post_Auto_IDE_Detect
		call	X_Get_ItemStat_AX
		and	ax, not ITEMDISABLE
		or	ax, di
		call	X_Set_ItemStat_AX

		push	word ptr CURSOR_X[bp]
		push	word ptr HDD_CURSOR_FLG[bp]

		mov	byte ptr HDD_CURSOR_FLG[bp], 0ffh	;prevent recursive
		call	X_Display_Whole_Item
		or	di, di			;item disable?
		jz	short @F		;no
		mov	ax, word ptr [bx].Item_Xaxis
		mov	CURSOR_X[bp], ax
		call	X_VNORMAL
		mov	si, offset LBA_Dont_Care_Str
		call	X_Display_String
	@@:
		pop	word ptr HDD_CURSOR_FLG[bp]
		pop	word ptr CURSOR_X[bp]
endif ;IDE_LBA_MODE_SUPPORT

		pop	bx

		stc
		ret
X_Prg_HDD_Parms_Attr	Endp

;[]===========================================================[]
;ReShow_HDD - show items including HDD type, sector, head
;	      cylinder, precomp, landing zone & HDD size
;
;input - BX : HDD C or D
;[]===========================================================[]
		Public	X_ReShow_HDD
X_ReShow_HDD	proc	near

		push	ax			;save registers
		push	bx
		push	cx

		call	X_Transfer_Hdd_Parms	;get all HDD parms

		push	dword ptr ATTRIBUTE[bp]
		mov	cx, (HDD_TYPE_DIFF/ITEM_SIZE)-1

Disp_Next_HDD_Item:

		add	bx, ITEM_SIZE		;point to next item
		push	cx			;save counter

;[]-----------------------------------------------------------------------[]
;  special treatment for Auto IDE Detection & HDD Low Level Format
;  Input : byte ptr USE_ITEMSTAT_BUF[bp]=0 : Normal call
;					 1 : call from routine: IDE_DETECT
;					     add CURSOR_Y[bp], 0
;					 2 : call from routime: HDD_LFormat
;					     add CURSOR_Y[bp], 8
;				    OTHERS : call from routine: IDE_DETECT
;					     CURSOR_Y[bp] = USE_ITEMSTAT_BUF[bp]
;[]-----------------------------------------------------------------------[]
		cmp	byte ptr USE_ITEMSTAT_BUF[bp], 0	;normal call?
		je	short Normal_ReShow_HDD		;yes

		call	X_Vnormal				;normal attribute
		call	X_Disp_ItemTitle
	ifdef	Support_4_IDE
		mov	al, 7
	else	;Support_4_IDE
		mov	al, 9				;cursor Y difference
	endif	;Support_4_IDE
		cmp	byte ptr USE_ITEMSTAT_BUF[bp], 2	;from HDD_LFormat?
		je	short @F			;yes
		xor	al, al				;cursor Y difference

		cmp	byte ptr USE_ITEMSTAT_BUF[bp], 1	;from IDE_DETECT?
		je	short @F			;yes

		sub	byte ptr CURSOR_X[bp], 5
		call	X_VReverse

		mov	al, USE_ITEMSTAT_BUF[bp]		;cursor Y difference
		mov	byte ptr CURSOR_Y[bp], 0		;use new CURSOR_Y

@@:
		add	CURSOR_Y[bp], al			;use new CURSOR_Y
		call	X_Disp_ItemVar			;show Items

		jmp	short @F

Normal_ReShow_HDD:
;---------------------------------------------------------------------------
		call	X_Display_Whole_Item		;display item
@@:
		pop	cx				;restore counter
		loop	short Disp_Next_HDD_Item	;show next
		pop	dword ptr ATTRIBUTE[bp]

		pop	cx				;restore registers
		pop	bx
		pop	ax
		ret

X_ReShow_HDD	endp

;[]===========================================================[]
;input : BX point to any HDD item
;output: CYLINDER[bp]
;	 HEAD[bp]
;	 PRECOMP[bp]
;	 LANDZONE[bp]
;	 SECTOR[bp]
;[]===========================================================[]
X_Transfer_Hdd_Parms	proc	near

;Clear all HDD parms in the first place

		xor	ax, ax
		mov	CYLINDER[bp], ax
		mov	HEAD[bp], al
		mov	SECTOR[bp], al
		mov	PRECOMP[bp], ax
		mov	LANDZONE[bp], ax

		push	si

		call	X_Get_HDD_CMOS_Info
		jnc	short @F
		jmp	Not_Hdd
	@@:
		jz	short Std_Hdd_Parm

ifdef auto_hdd_detect_in_STDCMOS		;R67A
	auto_detect_STDCMOS:			;R67A
endif ;auto_hdd_detect_in_STDCMOS		;R67A

		mov	ax, [bp+di+0]		;transfer cylinder no.
		mov	CYLINDER[bp], ax

		mov	al, [bp+di+2]		;transfer head no.
		mov	HEAD[bp], al

		mov	ax, [bp+di+3]		;transfer precomp
		mov	PRECOMP[bp], ax

		mov	ax, [bp+di+5]		;transfer landing zone
		mov	LANDZONE[bp], ax

		mov	al, [bp+di+7]		;transfer sector no.
		mov	SECTOR[bp], al

ifdef IDE_LBA_MODE_SUPPORT
		call	X_Chk_If_LARGE_Mode		;LARGE mode now?
		mov	si, offset Tran_CHS_LARGE
		je	short Trans_LBA_LARGE		;yes!

		call	X_Chk_If_LBA_Mode		;LBA mode now?
		jne	short No_LBA_LARGE		;no, skip!
		mov	si, offset Tran_CHS_LBA		;routine to call
		mov	word ptr PRECOMP[bp], 0
Trans_LBA_LARGE:
		push	bx
		mov	bx, CYLINDER[bp]
		mov	al, SECTOR[bp]
		mov	ah, HEAD[bp]
		POST_func_call	si
		mov	CYLINDER[bp], bx
		mov	SECTOR[bp], al
		mov	HEAD[bp], ah
		pop	bx
No_LBA_LARGE:
endif ;IDE_LBA_MODE_SUPPORT

	  	jmp	short Move_Exit

;-------------------
;transfer type 1-47
;-------------------

Std_Hdd_Parm:
;R67A start
ifdef auto_hdd_detect_in_STDCMOS
		cmp	byte ptr [bp+si], 47	;Hdd auto?
		je	short auto_detect_STDCMOS
endif ;auto_hdd_detect_in_STDCMOS
;R67A end
ifndef	Skip_HDD_Type_1_To_46
		cmp	byte ptr [bp+si], 0	;Hard disk exist?
		je	short Move_Exit
else	;Skip_HDD_Type_1_To_46
		cmp	byte ptr [bp+si], 47	;Hdd type 0 or auto?
		jbe	short Move_Exit
endif	;Skip_HDD_Type_1_To_46

	push	ds
	push	bx
	push	SEG DGROUP
	pop	ds
		mov	al, [bp+si]		;Hdd type no.
		xor	ah, ah
		dec	ax
		mov	cl, HDP_SIZE
		mul	cl

		mov	bx, offset DGROUP:HDISK_PARMS
		add	bx, ax

		mov	ax, [bx].MaxCyl
		mov	CYLINDER[bp], ax
		mov	al, [bx].MaxHead
		mov	HEAD[bp], al
		mov	al, [bx].MaxSector
		mov	SECTOR[bp], al

		mov	ax, [bx].MaxPreComp
		mov	PRECOMP[bp], ax
		mov	ax, [bx].MaxLandZone
		mov	LANDZONE[bp], ax
	pop	bx
	pop	ds

Move_Exit:
;R68;-------------------
;R68;calculate HDD size
;R68;-------------------
;R68
;R68		push	cx
;R68		xor	ah, ah
;R68		mov	al, HEAD[bp]
;R68		xor	ch, ch
;R68		mov	cl, SECTOR[bp]
;R68		shl	cx, 2
;R68		mul	cx
;R68		mul	word ptr CYLINDER[bp]
;R68		mov	cx, 15625/2
;R68		div	cx
;R68		mov	HDDSIZE[bp], ax
;R68		pop	cx
;R68 start
		mov	al,HEAD[bp]
		mov	ah,SECTOR[bp]
		mov	cx,CYLINDER[bp]
		call	Cal_HDD_Size
;R68 end

Not_Hdd:
		pop	si
		ret

X_Transfer_Hdd_Parms	endp

;R68 start
;----------------------------------------------
;calculate HDD size
;Input : AL = heads of HDD
;      	 AH = sectors of HDD
;      	 CX = cylinders of HDD
;Output: HDDSIZE[bp] = size of HDD
;	 HDDSIZE_Unit[bp] = unit of HDD's size
;----------------------------------------------
		public	Cal_HDD_Size
Cal_HDD_Size:
		push	eax
		push	ecx
		push	edx

		mul	ah			;heads * sectors
		mul	cx			; * cylinders

		ror	eax,16			;shift high word to low
		mov	ax,dx			;set high word = DX
		ror	eax,16
		xor	edx,edx			;clear divided number
		mov	ecx,1000000/512		;set diving number
		div	ecx
		mov	dl,HDDSIZE_MB		;assume MB (below 0ffffh)
		cmp	eax,0ffffh		;size over 0ffffh
		jb	short Fill_HDDSIZE_Stack;No,skip
		ror	eax,16
		mov	dx,ax
		ror	eax,16
		mov	cx,1000			;transfer to GB
		div	cx
		mov	dl,HDDSIZE_GB		;set GB string
Fill_HDDSIZE_Stack:
		mov	HDDSIZE_Unit[bp],dl	;set unit of HDD size
		mov	HDDSIZE[bp],ax		;set HDD size

		pop	edx
		pop	ecx
		pop	eax
		ret
;R68 end

;[]===========================================================[]
;[]===========================================================[]
		Public	fPROC_Check_Valid_HDD_Type
fPROC_Check_Valid_HDD_Type	Proc	Far

		mov	si, offset HDD_Type_Cmos
		mov	di, offset Skip_HDD_Type_Tbl
		mov	cx, NUM_OF_IDE_ITEM		;number of HDD to do

Next_Hdd_Drive:

		push	di
		push	si
		push	cx

		mov	si, cs:[si]
		and	si, 00ffH			;use byte only

		mov	al, byte ptr [bp+si]

		cmp	al, 51				;invalid HDD type
		ja	short Invalid_HDD

		mov	cx, NO_OF_SKIP_HDD
Next_Invalid_Hdd:
		cmp	al, cs:[di]
		je	short Invalid_HDD
		inc	di
		loop	short Next_Invalid_Hdd
		jmp	short Check_Next_Invalid

Invalid_HDD:
		mov	byte ptr [bp+si], 0
Check_Next_Invalid:

		pop	cx
		pop	si
		pop	di
		add	di, NO_OF_SKIP_HDD
		inc	si
		loop	short Next_Hdd_Drive

		ret

fPROC_Check_Valid_HDD_Type	Endp

;[]===========================================================[]
;Update_User_Type - 1. put parms for shown into corresponding
;		       stack area & re-show HDD size
;		    2. if Drive C = Drive D
;		       re-show Drive C & Drive D
;
;Input : BX - Point to any HDD parms items such as
;	      cylinders, sectors, head ....
;Subroutine type : Post-Do
;[]===========================================================[]
		Public	X_Update_User_Type
X_Update_User_Type	Proc	Near

		pusha

		cmp	al, Special_After
		jne	short Update_User_Type_Exit

		call	X_Get_HDD_CMOS_Info
		jc	short Update_User_Type_Exit	;not HDD Item
		jz	short Update_User_Type_Exit	;not user type

;put parms for shown into corresponding stack area

		mov	ax, CYLINDER[bp]
		mov	[bp+di+0], ax

		mov	al, HEAD[bp]
		mov	[bp+di+2], al

		mov	ax, PRECOMP[bp]
		mov	[bp+di+3], ax

		mov	ax, LANDZONE[bp]
		mov	[bp+di+5], ax

		mov	al, SECTOR[bp]
		mov	[bp+di+7], al

		push	dx
		call	X_Transfer_Hdd_Parms
		pop	dx
		mov	bx, dx
		add	bx, ITEM_SIZE
		call	X_Display_Whole_Item		;Display HDD Size

Update_User_Type_Exit:

		popa
		clc
		ret

X_Update_User_Type	Endp

ifdef	IDE_LBA_MODE_SUPPORT
		Public	X_Do_LBA
X_Do_LBA	Proc	Near

		cmp	al, Special_Before
		je	short Do_LBA_Before

		pusha
		call	X_Get_HDD_CMOS_Info
		mov	bx, dx
		call	X_Prg_HDD_Parms_Attr
		call	X_ReShow_HDD
		popa

	Do_LBA_Exit:

		clc
		ret

Do_LBA_Before:
		cmp	word ptr LAST_KEY[bp], LEFT_ARROW
		jne	short Try_Do_LBA_UP
		call	X_Get_HDD_CMOS_Info
		mov	OLDITEM[bp], dx
		sub	bx, ITEM_SIZE
		call	X_Get_Itemstat_AX
		test	ax, SHOWONLY
		jz	@F
		mov	bx, dx
		call	KEYIN_OLD_Together
		ret
	@@:
		call	Only_KEYIN_Moves
		ret
Try_Do_LBA_UP:
		cmp	word ptr LAST_KEY[bp], UP_ARROW
		je	short @F
Try_Do_LBA_DOWN:
		cmp	word ptr LAST_KEY[bp], DOWN_ARROW
		jne	short Do_LBA_Exit
	@@:
		call	X_Move_HDD_CURSOR
		ret

X_Do_LBA	Endp

		Public	fPROC_Chk_If_LARGE_Mode
fPROC_Chk_If_LARGE_Mode	Proc	Far
		call	X_Chk_If_LARGE_Mode
		ret
fPROC_Chk_If_LARGE_Mode	Endp

		Public	fPROC_Chk_If_LBA_Mode
fPROC_Chk_If_LBA_Mode	Proc	Far
		call	X_Chk_If_LBA_Mode
		ret
fPROC_Chk_If_LBA_Mode	Endp

		Public	X_Chk_If_LARGE_Mode
X_Chk_If_LARGE_Mode	Label	Near

		mov	al, 2
		jmp	short Detect_LBA_LARGE

;input : bx = hdd item offset
;output: zf = 1 disable
;	 zf = 0 enable
		Public	X_Chk_If_LBA_Mode
X_Chk_If_LBA_Mode	Proc	Near

		mov	al, 1

Detect_LBA_LARGE	Label	Near

		pusha
		call	X_Get_HDD_CMOS_Info

		mov	bx, dx
		add	bx, HDD_TYPE_DIFF-ITEM_SIZE
		push	ax
		call	X_Read_Item_Value
		pop	ax
		cmp	dl, al

		popa
		ret

X_Chk_If_LBA_Mode	Endp
endif	;IDE_LBA_MODE_SUPPORT

;[]===========================================================[]
;[]===========================================================[]
fPROC_Move_HDD_Cursor	Proc	Far
		call	X_Move_HDD_Cursor
		ret
fPROC_Move_HDD_Cursor	Endp
X_Move_HDD_Cursor	Proc	Near

;------------------------------------------------------------
;Try to move the KEYIN_ITEM_OFF[bp] according to LAST_KEY[bp]
;------------------------------------------------------------

		mov	di, LAST_KEY[bp]
		mov	ax, KEYIN_ITEM_OFF[bp]

;------------------------------------------------------------------------
Try_Move_HDD_LA:

		cmp	di, LEFT_ARROW		;input key = LEFT_ARROW ?
		jne	short Try_Move_HDD_RA	;no, try next!

		mov	bx, ax

ifdef	IDE_LBA_MODE_SUPPORT
		pusha
		mov	ax, OLDITEM[bp]
		cmp	ax, KEYIN_ITEM_OFF[bp]
		popa
		je	short TRY_LA_1
endif	;IDE_LBA_MODE_SUPPORT

		call	X_Move_Cursor		;check where will KEYIN_ITEM go

		call	X_Check_If_HDD_Type_Item;does KEYIN_ITEM go to HDD type item?
		jne	Only_KEYIN_Moves	;no, so only KEYIN item moves

	TRY_LA_1:

		F000_call Up_Line		;if go up...

		mov	bx, si
		call	X_Check_If_HDD_Type_Item;does Up_Line cause bx to go to HDD type item?
		je	short KEYIN_OLD_Together;yes, put KEYIN & OLITEM together

		mov	bx, si			;go up --> HOUR item
		F000_call Go_Most_Right_Item	;so, according to AMI's setup, 
		mov	bx, si
		jmp	short KEYIN_OLD_Together;go to SECOND item

;------------------------------------------------------------------------
Try_Move_HDD_RA:
		cmp	di, K_CR1		;input key = ENTER ?
ifndef Auto_HDD_Detect_IN_STDCMOS			;R67
		je	short RA_Cont		;yes, continue
;R67 start
else ;Auto_HDD_Detect_IN_STDCMOS
		jne	short not_enter_auto
		call	X_Auto_Detect_Type
		jmp	short @F
	not_enter_auto:
endif ;Auto_HDD_Detect_IN_STDCMOS
;R67 end
		cmp	di, RIGHT_ARROW		;input key = RIGHT_ARROW ?
		jne	short Try_Move_HDD_UA	;no, try next
	RA_Cont:
		mov	bx, ax
		call	X_Move_Cursor		;check where will KEYIN_ITEM go

		call	X_Check_If_HDD_Type_Item	;KEYIN_ITEM go to next HDD type item?
		je	short @F		;yes, so put KEYIN & OLITEM together

ifdef	IDE_LBA_MODE_SUPPORT
		call	X_Check_If_LBA_Item
		je	short @F
endif	;IDE_LBA_MODE_SUPPORT

		cmp	bx, LAST_HDD_ITEM	;KEYIN_ITEM go to HDD para. item?
		jbe	short Only_KEYIN_Moves	;yes, so only KEYIN item moves
	@@:
		jmp	short KEYIN_OLD_Together;put KEYIN & OLITEM together

;------------------------------------------------------------------------
Try_Move_HDD_UA:

		cmp	di, UP_ARROW		;input key = UP_ARROW ?
		jne	short Try_Move_HDD_DA	;no, try next

		mov	bx, OLDITEM[bp]		;OLITEM[bp] = HDD type item
		jmp	short TRY_LA_1

;------------------------------------------------------------------------
Try_Move_HDD_DA:

		cmp	di, DOWN_ARROW		;input key = DOWN_ARROW ?
		je	short @F		;yes, continue
		clc
		ret				;exit
	@@:
		mov	bx, OLDITEM[bp]		;OLITEM[bp] = HDD type item
		F000_call Down_Line		;OLITEM go down and put
		mov	bx, si
						;  KEYIN & OLITEM together

;------------------------------------------------------------------------
KEYIN_OLD_Together	Label	Near

		call	ReDisp_KEYIN

		cmp	OLDITEM[bp], bx
		je	short @F
		xchg	OLDITEM[bp], bx
		call	X_Display_Whole_Item
		mov	bx, OLDITEM[bp]
	@@:
		jmp	short Move_HDD_Exit0

;------------------------------------------------------------------------
Only_KEYIN_Moves	Label	Near

		call	ReDisp_KEYIN
		mov	bx, OLDITEM[bp]

;------------------------------------------------------------------------
Move_HDD_Exit0:
		mov	byte ptr HDD_CURSOR_FLG[bp], 0
		mov	word ptr LAST_KEY[bp], 0
		ret

X_Move_HDD_Cursor	Endp

ReDisp_KEYIN	Proc	Near

		mov	byte ptr HDD_CURSOR_FLG[bp], 0ffh
		pusha
		push	word ptr OLDITEM[bp]
		xchg	KEYIN_ITEM_OFF[bp], bx
		call	X_Check_If_HDD_Type_Item
		jne	short @F
		mov	byte ptr HDD_CURSOR_FLG[bp], 0
		mov	word ptr OLDITEM[bp], -1
	@@:
		call	X_Display_Whole_Item
		pop	word ptr OLDITEM[bp]
		popa
		ret

ReDisp_KEYIN	Endp

;[]===========================================================[]
;[]===========================================================[]
X_Show_HDD_Cursor	Proc	Near

		push	bx

		mov	si, Color_Offset[bp]
		mov	dl, [si].CREVERSE
		cmp	byte ptr ATTRIBUTE[bp], dl
		jne	short Show_HDD_Cursor_End

		mov	bx, OLDITEM[bp]
		cmp	bx, KEYIN_ITEM_OFF[bp]		;KEYIN_ITEM=OLDITEM?
		je	short Seperate_Cursor		;yes, try to seperate

;---------------------------------------------------------------------------
Merge_Cursor:

		call	X_Get_HDD_CMOS_Info
		jnz	short Show_HDD_Cursor_End	;NZ = user type

		mov	KEYIN_ITEM_OFF[bp], dx
		jmp	short Show_HDD_Cursor_End

;---------------------------------------------------------------------------
Seperate_Cursor:

		call	X_Get_HDD_CMOS_Info
		jz	short Show_HDD_Cursor_End	;ZF = type 0-46

		call	X_Check_If_HDD_Type_Item

		pushf
		mov	OLDITEM[bp], dx
		mov	bx, dx
		call	Reverse_It

	ifdef	IDE_LBA_MODE_SUPPORT
		mov	KEYIN_ITEM_OFF[bp], bx
		call	X_Chk_If_LBA_Mode		;LBA mode ?
		je	short @F			;yes
		call	X_Chk_If_LARGE_Mode		;LARGE mode?
		je	short @F			;yes
	endif	;IDE_LBA_MODE_SUPPORT

		add	bx, ITEM_SIZE*2
		mov	KEYIN_ITEM_OFF[bp], bx
		call	Reverse_It
@@:
		popf
		je	short Cur_In_HDD_Type

		pop	ax				;abandon original BX
		stc
		ret

Cur_In_HDD_Type:
Show_HDD_Cursor_End:

		pop	bx
		clc
		ret

X_Show_HDD_Cursor	Endp

Reverse_It	Proc	Near

		mov	byte ptr HDD_CURSOR_FLG[bp], 0ffh
		call	X_Vnormal
		push	word ptr CURSOR_X[bp]
		call	X_Disp_ItemTitle
		call	X_VReverse
		call	X_Disp_ItemVar
		pop	word ptr CURSOR_X[bp]
		mov	byte ptr HDD_CURSOR_FLG[bp], 0
		ret

Reverse_It	Endp
;R59 - ends

;R67 start
ifdef Auto_HDD_Detect_IN_STDCMOS
;[]===========================================================[]
;[]===========================================================[]
		Public	X_Check_If_Auto_Type
X_Check_If_Auto_Type	Proc	Near
		pushad
		call	X_Check_If_HDD_Type_Item
		jne	short not_type_item
		call	X_Read_Item_Value
		cmp	dx,47
	not_type_item:
		popad
		ret
X_Check_If_Auto_Type	Endp
;[]===========================================================[]
;[]===========================================================[]
X_Auto_Detect_Type	Proc	Near
		push	word ptr CMOS3B[bp]
		push	word ptr CMOS_LBA_LGA[bp]

		call	X_Get_HDD_CMOS_Info		;DX = HDD type item offset
							;SI = HDD type loc.
							;DI = HDD params loc.
		push	word ptr FIXED_TYPE[bp]
		push	word ptr [bp+si]		;save hdd type

		mov	ax, di				;AX = HDD params loc.
		mov	cx, 8				;save HDD params
	@@:
		push	word ptr [bp+di]		;store into stack
		add	di, 2				;next CMOS point
		loop	@B
		mov	di, ax				;restore HDD parmas to DI

		POST_func_call	Auto_IDE_Detect_X
;----------------------------------------------------
;accept the HDD found
;----------------------------------------------------
		clc
		add	sp, 12*2			;balance stack

;R67A start
		mov	al,byte ptr [bp+di+0]		;get cylinder
		mov	ah,byte ptr [bp+di+2]		;get heads
		or	ax,ax
		jnz	short @F
		mov	word ptr [bp+di+3],0		;set no precomp
		mov	word ptr [bp+di+5],0		;set landing zone
	@@:
		mov	byte ptr [bp+si],47
;R67A end

		ret
X_Auto_Detect_Type	endp
endif ;auto_hdd_detect_in_STDCMOS
;R67 end

XCODE		ENDS
;R58 - ends

		END
