
PAGE  59,240

;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
;лл					                                 лл
;лл				BIOS	                                 лл
;лл	             SECURITY HARD DISK SUPPORT                          лл
;лл					                                 лл
;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

target		EQU   'T3'                      ; Target assembler: TASM-3.2

.286
TEMP1                   EQU     1000H
IDE_DX_REG              EQU     1002H
SP_STORED               EQU     1004H
CURRENT_POS_DH		EQU	1006H
FIRST_PASSWORD_BUF      EQU     1020H   ;TO 3FH
SECOND_PASSWORD_BUF     EQU     1040H   ;TO 5FH
TEMP_STR                EQU     1060H   ;TO 6FH

ATA_COMMAND             EQU     1080H
IDE_NUMBER              EQU     1082H   ;0=IDE 1 80H=IDE 2
DEVICE_NUMBER           EQU     1084H   ;0=DEV 0 10H=DEV 1
SECURITY_SUPPORT        EQU     1086H   ;00or02 NOT SUPORT;03 SUPORT;01 MAY BE SUPORT
SECURITY_LEVEL          EQU     1088H   ;00 LEVEL HIGH; 01 LEVEL MAXIMUM
MAS_PAS_REV_COD         EQU     108AH
PASSWORD_TYPE           EQU     108CH   ;00-USER 01-MASTER

HDD_INFO_BEGIN		EQU	1100H
HDD_INFO_END		EQU	12FFH
HDD_PASSWORD_BEGIN      EQU	1300H
HDD_PASSWORD_END	EQU	14FFH


KBD_KEY_CODE            EQU     1900H   ;ALT+P
SHORT_KEY_CODE		EQU     2E00H	;ALT+C
WORK_SEGMENT            EQU     08000H  ;0B800H

SECONDS_FOR_WAIT	EQU	3
IDE_1_CONST		EQU	0
IDE_2_CONST		EQU	80H
DEV_0_CONST		EQU	0
DEV_1_CONST		EQU	10H
SECURITY_LEVEL_CONST	EQU

ATA_IDENTIFY_DEVICE     EQU     0ECH
ATA_SECURITY_DISABLE_PASSWORD   EQU     0F6H
ATA_SECURITY_ERASE_PREPARE      EQU     0F3H
ATA_SECURITY_ERASE_UNIT EQU     0F4H
ATA_SECURITY_FREEZE_LOCK        EQU     0F5H
ATA_SECURITY_SET_PASSWORD       EQU     0F1H
ATA_SECURITY_UNLOCK             EQU     0F2H

IDE1_ALTERNATE_STATUS   EQU     3F6H    ;READ ONLY
IDE1_DEVICE_CONTROL     EQU     3F6H    ;WRITE ONLY

IDE1_DATA               EQU     1F0H    ;16 bit R/W
IDE1_DEVICE_HEAD        EQU     1F6H    ;R/W
IDE1_COMMAND		EQU	1F7H	;WRITE ONLY
IDE1_STATUS		EQU	1F7H    ;READ ONLY

IDE2_ALTERNATE_STATUS   EQU     376H    ;READ ONLY
IDE2_DEVICE_CONTROL     EQU     376H    ;WRITE ONLY

IDE2_DATA               EQU     170H    ;16 bit
IDE2_DEVICE_HEAD        EQU     176H    ;R/W
IDE2_COMMAND		EQU	177H	;WRITE ONLY
IDE2_STATUS		EQU	177H    ;READ ONLY
;------------------------------------------------------------  seg_d   ----

		CODE SEGMENT

		ASSUME CS:CODE, DS:CODE
		ORG	100H	;0000H !!!!!!!!!!!!!!!!!!
START:
	JMP	INIT_START	;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

						; лпппппппппппппппппппппппппппппппл
						; л         ROM BEGINNING         л
						; лмммммммммммммммммммммммммммммммл

ROM_HEADER_WORD	DW	0AA55H			; ROM signature word
ROM_SIZE	DB	20H			; Number of 512 byte pages

                JMP     INIT_START
CHECK_SUM       DB      0FFH                    ;simple BYTE sum of ROM_SIZE*512 bytes must be zero
		DB	0FFH
INIT_START:
		PUSHA
		PUSH	ES
                PUSH    DS

                MOV     AX,WORK_SEGMENT
                MOV     ES,AX
                MOV     WORD PTR ES:[SP_STORED],SP

		CALL	WAIT_3S

		MOV	DX,0101H
		CALL	GOTOXY

		CALL	VERIFY_KBD
		JNZ	KEY_IS_PRESSED_01
		JMP	NO_PASS_KEY
KEY_IS_PRESSED_01:
		CMP	AX,KBD_KEY_CODE
		JE	MAY_INPUT_PASSWORD
		CMP	AX,SHORT_KEY_CODE
		JE	MAY_INPUT_USER_PASS
		CALL	READ_KBD
		JMP     NO_PASS_KEY
MAY_INPUT_PASSWORD:
                CALL    READ_KBD

;;             	MOV	BX,OFFSET MESS_WAIT_FOR_CTRL_P
;;              CALL    WRITE_STRING

;;		CALL	CLRSCR
                CALL    PRINT_MENU

NO_PASS_KEY:
ERROR_EXIT:
		POP	DS
		POP	ES
		POPA
	RET	;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                RETF
;=======================================================================
MAY_INPUT_USER_PASS:
                CALL    READ_KBD
		CALL	CLRSCR

                MOV     AX,WORK_SEGMENT
                MOV     ES,AX

                MOV     DX,0101H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_VERSION
		CALL	WRITE_STRING

		MOV	BYTE PTR ES:[CURRENT_POS_DH],02
                MOV     BYTE PTR ES:[IDE_NUMBER],IDE_1_CONST
                MOV     BYTE PTR ES:[DEVICE_NUMBER],DEV_0_CONST
                MOV     BYTE PTR ES:[PASSWORD_TYPE],0 ;USER

		CALL	SEARCH_FOR_NEXT_ID

                MOV     BYTE PTR ES:[DEVICE_NUMBER],DEV_1_CONST
		INC	BYTE PTR ES:[CURRENT_POS_DH]
		CALL	SEARCH_FOR_NEXT_ID

                MOV     BYTE PTR ES:[DEVICE_NUMBER],DEV_0_CONST
                MOV     BYTE PTR ES:[IDE_NUMBER],IDE_2_CONST
		INC	BYTE PTR ES:[CURRENT_POS_DH]
		CALL	SEARCH_FOR_NEXT_ID

                MOV     BYTE PTR ES:[DEVICE_NUMBER],DEV_1_CONST
                MOV     BYTE PTR ES:[IDE_NUMBER],IDE_2_CONST
		INC	BYTE PTR ES:[CURRENT_POS_DH]
		CALL	SEARCH_FOR_NEXT_ID

		JMP	ERROR_EXIT

SEARCH_FOR_NEXT_ID:
		MOV	DH,BYTE PTR ES:[CURRENT_POS_DH]
                MOV     DL,01H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_CURRENT_DEVICE
		CALL	WRITE_STRING
                CLI
                CALL    IDENT_DEVICE
                STI
		CMP	CX,0FFFEH
		JNE	NO_ERR_IDN_I1D0
		MOV	DH,BYTE PTR ES:[CURRENT_POS_DH]
                MOV     DL,1EH
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_ERR_IDENT
		CALL	WRITE_STRING
		CALL	PRINT_DEVICE_NAME
		JMP	SEARCH_FOR_NEXT_I1_D1
NO_ERR_IDN_I1D0:
		CALL	PRINT_DEVICE_NAME
		CMP	AL,'5'
		JB	SEARCH_FOR_NEXT_I1_D1	;IS < ATA-5 NO PASSWORD
;ASSUME THAT VERSION >= ATA-5 SUPPORT PASSWORD
                MOV     AL,ES:[HDD_INFO_BEGIN+1+128*2]
                AND     AL,04H
		JZ	SEARCH_FOR_NEXT_I1_D1	;UNLOCKED
		INC	BYTE PTR ES:[CURRENT_POS_DH]
		CALL	UNLOCK_WITH_CTP
SEARCH_FOR_NEXT_I1_D1:
		RET

;------------------------------------------
PRINT_MENU:
                MOV     AX,WORK_SEGMENT
                MOV     ES,AX
                MOV     BYTE PTR ES:[IDE_NUMBER],0
                MOV     BYTE PTR ES:[DEVICE_NUMBER],0
                MOV     BYTE PTR ES:[PASSWORD_TYPE],0 ;USER
PAK_IDENT_PM:
		CALL	CLRSCR
                MOV     AX,WORK_SEGMENT
                MOV     ES,AX

                MOV     DX,0101H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_VERSION
		CALL	WRITE_STRING

                CLI
                CALL    IDENT_DEVICE
                STI
		CMP	CX,0FFFEH
		JNE	NO_ERR_IDN_PM
                MOV     DX,0201H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_ERR_IDENT
		CALL	WRITE_STRING
		JMP	DRAW_MAIN_MENU
NO_ERR_IDN_PM:
;---------------
                MOV     DX,0201H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_CURRENT_DEVICE
                CALL    WRITE_STRING

		MOV	BYTE PTR ES:[CURRENT_POS_DH],02
		CALL	PRINT_DEVICE_NAME

                MOV     BYTE PTR ES:[SECURITY_SUPPORT],00
                CMP     WORD PTR ES:[HDD_INFO_BEGIN+82*2],0000H
                JNE     VER_FFFF
                CMP     WORD PTR ES:[HDD_INFO_BEGIN+83*2],0000H
                JE      NOT_SUPPORT_SECURITY_00
VER_FFFF:
                CMP     WORD PTR ES:[HDD_INFO_BEGIN+82*2],0FFFFH
                JNE     MAY_SUPPORT_SECURITY1
                CMP     WORD PTR ES:[HDD_INFO_BEGIN+83*2],0FFFFH
                JE      NOT_SUPPORT_SECURITY_00
MAY_SUPPORT_SECURITY1:
                MOV     AL,ES:[HDD_INFO_BEGIN+1+82*2]
                AND     AL,02
                MOV     ES:[SECURITY_SUPPORT],AL
                MOV     AL,ES:[HDD_INFO_BEGIN+1+128*2]
                AND     AL,01
                OR      ES:[SECURITY_SUPPORT],AL
NOT_SUPPORT_SECURITY_00:
                CMP     BYTE PTR ES:[SECURITY_SUPPORT],00
                JNE     SUPPORT_SECURITY_01
                JMP     NOT_SUPPORT_SECURITY
SUPPORT_SECURITY_01:
;---------------
                MOV     DX,0301H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_SECURITY_SET_INFORMATION
                CALL    WRITE_STRING

                MOV     BX,OFFSET MESS_NOT_SUPPORTED
                MOV     AL,ES:[HDD_INFO_BEGIN+1+82*2]
                AND     AL,02
                JZ      NO_82_01
                MOV     BX,OFFSET MESS_SUPPORTED
NO_82_01:
                CALL    WRITE_STRING

                MOV     BX,OFFSET MESS_NOT_SUPPORTED
                MOV     AL,ES:[HDD_INFO_BEGIN+1+128*2]
                AND     AL,01
                JZ      NO_128_00
                MOV     BX,OFFSET MESS_SUPPORTED
NO_128_00:
                CALL    WRITE_STRING

                MOV     BX,OFFSET MESS_DISABLED
                MOV     AL,ES:[HDD_INFO_BEGIN+1+85*2]
                AND     AL,02
                JZ      NO_85_01
                MOV     BX,OFFSET MESS_ENABLED
NO_85_01:
                CALL    WRITE_STRING

                MOV     BX,OFFSET MESS_DISABLED
                MOV     AL,ES:[HDD_INFO_BEGIN+1+128*2]
                AND     AL,02
                JZ      NO_128_02
                MOV     BX,OFFSET MESS_ENABLED
NO_128_02:
                CALL    WRITE_STRING


                MOV     DX,0401H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_SECURITY_STATUS
                CALL    WRITE_STRING

                MOV     BX,OFFSET MESS_UNLOCKED
                MOV     AL,ES:[HDD_INFO_BEGIN+1+128*2]
                AND     AL,04H
                JZ      DEVICE_IS_UNLOCKED
                MOV     BX,OFFSET MESS_LOCKED
DEVICE_IS_UNLOCKED:
                CALL    WRITE_STRING

                MOV     BX,OFFSET MESS_NOT_FROZEN
                MOV     AL,ES:[HDD_INFO_BEGIN+1+128*2]
                AND     AL,08H
                JZ      DEVICE_IS_NOT_FROZEN_01
                MOV     BX,OFFSET MESS_FROZEN
DEVICE_IS_NOT_FROZEN_01:
                CALL    WRITE_STRING

                MOV     BX,OFFSET MESS_HILEVEL
		MOV	BYTE PTR ES:[SECURITY_LEVEL],00
                MOV     AL,ES:[HDD_INFO_BEGIN+128*2]
                AND     AL,01H
                JZ      SECURITY_IS_HIGH_01
		MOV	BYTE PTR ES:[SECURITY_LEVEL],01
                MOV     BX,OFFSET MESS_MAXLEVEL
SECURITY_IS_HIGH_01:
                CALL    WRITE_STRING

                MOV     DX,0501H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_PASSWORD_COUNTER_OK
                MOV     AL,ES:[HDD_INFO_BEGIN+1+128*2]
                AND     AL,10H
                JZ      PK_IS_OK_01
                MOV     BX,OFFSET MESS_PASSWORD_COUNTER_EXPIRED
PK_IS_OK_01:
                CALL    WRITE_STRING

                MOV     DX,0601H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_ENH_SEC_ERASE
                CALL    WRITE_STRING

                MOV     BX,OFFSET MESS_NOT_SUPPORTED
                MOV     AL,ES:[HDD_INFO_BEGIN+1+128*2]
                AND     AL,20H
                JZ      EH_IS_SP_01
                MOV     BX,OFFSET MESS_SUPPORTED
EH_IS_SP_01:
                CALL    WRITE_STRING



                MOV     DX,0701H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_HOST_PROT_AREA_INF
                CALL    WRITE_STRING

                MOV     BX,OFFSET MESS_NOT_SUPPORTED
                MOV     AL,ES:[HDD_INFO_BEGIN+83*2]
                AND     AL,01
                JZ      NO_83_00
                MOV     BX,OFFSET MESS_SUPPORTED
NO_83_00:
                CALL    WRITE_STRING

                MOV     DX,0801H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_HOST_PROT_AREA_STATUS
                CALL    WRITE_STRING

                MOV     BX,OFFSET MESS_SMS_NOT
                MOV     AL,ES:[HDD_INFO_BEGIN+86*2]
                AND     AL,01
                JZ      NO_86_00
                MOV     BX,OFFSET MESS_SMS_ENABLED
NO_86_00:
                CALL    WRITE_STRING

                MOV     DX,0901H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_MAST_PASS_REV
                CALL    WRITE_STRING

                MOV     AH,ES:[HDD_INFO_BEGIN+92*2]
                MOV     AL,ES:[HDD_INFO_BEGIN+1+92*2]
                MOV     ES:[MAS_PAS_REV_COD],AX
                CALL    CONV_4HEX_4ASCII
                MOV     ES:[TEMP_STR],AX
                MOV     ES:[TEMP_STR+2],DX
                MOV     WORD PTR ES:[TEMP_STR+4],00
                MOV     BX,OFFSET TEMP_STR
                CALL    WRITE_STRING_WITH_ES
                MOV     BX,OFFSET MESS_0ORF_NO
                CALL    WRITE_STRING

;-----------------DRAW MAIN MENU-----------------------
DRAW_MAIN_MENU:
                MOV     DX,0C01H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_WHAT
                CALL    WRITE_STRING
                MOV     DX,0E01H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_EXIT
                CALL    WRITE_STRING
                MOV     DX,0F01H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_ENTER_USER_PASSWORD
                CALL    WRITE_STRING
                MOV     DX,1001H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_ENTER_MASTER_PASSWORD
                CALL    WRITE_STRING
                MOV     DX,1101H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_DISABLE_SECURITY
                CALL    WRITE_STRING
                MOV     DX,1201H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_ENTER_DEVICE_NUMBER
                CALL    WRITE_STRING
                MOV     DX,1301H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_ENTER_IDE_NUMBER
                CALL    WRITE_STRING
                MOV     DX,1401H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_UNLOCK_DEVICE
                CALL    WRITE_STRING
                MOV     DX,1501H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_ERASE_PASSWORD
                CALL    WRITE_STRING
KEY_IS_NOT_PRESSED_MM:
		CALL	VERIFY_KBD
                JZ      KEY_IS_NOT_PRESSED_MM
                CALL    READ_KBD
                CMP     AL,'1'
                JNE     NO_1_MM
                JMP     TO_EXIT_MM
NO_1_MM:
                CMP     AL,'2'
                JNE     NO_2_MM
                CALL    SET_USER_PASSWORD_AND_LOCK
                MOV     BX,OFFSET MESS_QUEST_MP
                CALL    WRITE_STRING
KEY_IS_NOT_PRESSED_QMP:
		CALL	VERIFY_KBD
                JZ      KEY_IS_NOT_PRESSED_QMP
                CALL    READ_KBD
                CMP     AL,'0'
                JE      NEXT_QMP_1
                CMP     AL,'1'
                JNE     KEY_IS_NOT_PRESSED_QMP
                CALL    SET_MASTER_PASSWORD
NEXT_QMP_1:
                JMP     PAK_IDENT_PM
NO_2_MM:
                CMP     AL,'3'
                JNE     NO_3_MM
                CALL    SET_MASTER_PASSWORD
                JMP     PAK_IDENT_PM
NO_3_MM:
                CMP     AL,'4'
                JNE     NO_4_MM
                CALL    DISABLE_SECURITY
                JMP     PAK_IDENT_PM
NO_4_MM:
                CMP     AL,'5'
                JNE     NO_5_MM
                CALL    ENTER_DEV_NUM
                JMP     PAK_IDENT_PM
NO_5_MM:
                CMP     AL,'6'
                JNE     NO_6_MM
                CALL    ENTER_IDE_NUM
                JMP     PAK_IDENT_PM
NO_6_MM:
                CMP     AL,'7'
                JNE     NO_7_MM
                CALL    UNLOCK_DEVICE
                JMP     PAK_IDENT_PM
NO_7_MM:
                JMP     KEY_IS_NOT_PRESSED_MM
TO_EXIT_MM:
                RET
;-------------------------------------------------------
SET_USER_PASSWORD_AND_LOCK:
                MOV     AX,WORK_SEGMENT
                MOV     ES,AX
                MOV     BYTE PTR ES:[PASSWORD_TYPE],00  ;USER
                CALL    ENTER_PASSWORD_ONE
                CALL    ENTER_PASSWORD_TWO

                MOV     AX,WORK_SEGMENT
                MOV     ES,AX
                MOV     BX,FIRST_PASSWORD_BUF
                MOV     SI,SECOND_PASSWORD_BUF
                MOV     CX,10H
PAK_COMP_PAS:
                MOV     AX,ES:[BX]
                CMP     AX,ES:[SI]
		JE	NEXT_CHAR_ESL
                JMP     PASSWORDS_NOT_IDENT
NEXT_CHAR_ESL:
                INC     BX
                INC     BX
                INC     SI
                INC     SI
                LOOP    PAK_COMP_PAS

                MOV     BYTE PTR ES:[SECURITY_LEVEL],0
                MOV     DX,0301H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_ENTER_SECURITY_LEVEL
                CALL    WRITE_STRING
                MOV     DX,0401H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_NOTE_SL
                CALL    WRITE_STRING
KEY_IS_NOT_PRESSED_ESL:
		CALL	VERIFY_KBD
                JZ      KEY_IS_NOT_PRESSED_ESL
                CALL    READ_KBD
                CMP     AL,'0'
                JE      NEXT_ESL_1
                CMP     AL,'1'
                JNE     KEY_IS_NOT_PRESSED_ESL
                MOV     BYTE PTR ES:[SECURITY_LEVEL],1
NEXT_ESL_1:
                CALL    CLR_HDD_PAS_BUF
		MOV	AL,BYTE PTR ES:[SECURITY_LEVEL]
                MOV     BYTE PTR ES:[HDD_PASSWORD_BEGIN],AL    ;HI BYTE
		;BIT 0=PASSWORD 0-USER 1-MASTER bit 8=LEVEL 0-HIGH  1-MAXIMUM
                MOV     BYTE PTR ES:[HDD_PASSWORD_BEGIN+1],00H ;LOW BYTE
                MOV     BX,HDD_PASSWORD_BEGIN+2
                MOV     SI,FIRST_PASSWORD_BUF
                MOV     CX,10H
PAK_COPY_PAS_PL:
                MOV     AX,ES:[SI]
;;;;                XCXG    AL,AH ADDED FOR ADDITIONAL ENCODINC OF PASSWORD
                MOV     ES:[BX],AX
                INC     BX
                INC     BX
                INC     SI
                INC     SI
                LOOP    PAK_COPY_PAS_PL

                MOV     BYTE PTR ES:[ATA_COMMAND],ATA_SECURITY_SET_PASSWORD
                CALL    SEND_HDD_PASSWORD_BEGIN_BUFFER
		CALL	CLRSCR
                RET
PASSWORDS_NOT_IDENT:
                MOV     DX,0401H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_PASSWORD_NO_IDENT
                CALL    WRITE_STRING
                MOV     DX,0501H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_PRESS_A_KEY
                CALL    WRITE_STRING
KEY_IS_NOT_PRESSED_NI:
		CALL	VERIFY_KBD
                JZ      KEY_IS_NOT_PRESSED_NI
                CALL    READ_KBD

                RET
;-------------------------------------------------------
SET_MASTER_PASSWORD:
                MOV     AX,WORK_SEGMENT
                MOV     ES,AX
                MOV     BYTE PTR ES:[PASSWORD_TYPE],01  ;MASTER
                CALL    ENTER_PASSWORD_ONE
                CALL    ENTER_PASSWORD_TWO

                MOV     AX,WORK_SEGMENT
                MOV     ES,AX
                MOV     BX,FIRST_PASSWORD_BUF
                MOV     SI,SECOND_PASSWORD_BUF
                MOV     CX,10H
PAK_COMP_PAS_MP:
                MOV     AX,ES:[BX]
                CMP     AX,ES:[SI]
                JE      NEXT_CHAR_ESL_MP
                JMP     PASSWORDS_NOT_IDENT_MP
NEXT_CHAR_ESL_MP:
                INC     BX
                INC     BX
                INC     SI
                INC     SI
                LOOP    PAK_COMP_PAS_MP

                CALL    CLR_HDD_PAS_BUF
                MOV     BYTE PTR ES:[HDD_PASSWORD_BEGIN],01H    ;HI BYTE
		;BIT 0=PASSWORD 0-USER 1-MASTER bit 8=LEVEL 0-HIGH  1-MAXIMUM
                MOV     BYTE PTR ES:[HDD_PASSWORD_BEGIN+1],01H ;LOW BYTE
                MOV     BX,HDD_PASSWORD_BEGIN+2
                MOV     SI,FIRST_PASSWORD_BUF
                MOV     CX,10H
PAK_COPY_PAS_PL_MP:
                MOV     AX,ES:[SI]
;;;;                XCXG    AL,AH ADDED FOR ADDITIONAL ENCODINC OF PASSWORD
                MOV     ES:[BX],AX
                INC     BX
                INC     BX
                INC     SI
                INC     SI
                LOOP    PAK_COPY_PAS_PL_MP
                MOV     AX,ES:[MAS_PAS_REV_COD]
                INC     AX
                MOV     ES:[BX],AX


                MOV     BYTE PTR ES:[ATA_COMMAND],ATA_SECURITY_SET_PASSWORD
                CALL    SEND_HDD_PASSWORD_BEGIN_BUFFER
		CALL	CLRSCR
                RET
PASSWORDS_NOT_IDENT_MP:
                MOV     DX,0401H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_PASSWORD_NO_IDENT
                CALL    WRITE_STRING
                MOV     DX,0501H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_PRESS_A_KEY
                CALL    WRITE_STRING
KEY_IS_NOT_PRESSED_NI_MP:
		CALL	VERIFY_KBD
                JZ      KEY_IS_NOT_PRESSED_NI_MP
                CALL    READ_KBD

                RET
;-------------------------------------------------------

;-------------------------------------------------------
DISABLE_SECURITY:

		CALL	CLRSCR
                MOV     DX,0101H
                CALL    GOTOXY
                MOV     AX,WORK_SEGMENT
                MOV     ES,AX
                MOV     AL,ES:[HDD_INFO_BEGIN+1+128*2]
                AND     AL,04H
                JZ      DEVICE_IS_UNLOCKED_DS
                MOV     BX,OFFSET MESS_DEV_IS_LOCKED
                CALL    WRITE_STRING
                MOV     DX,0201H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_PRESS_A_KEY
                CALL    WRITE_STRING
KEY_IS_NOT_PRESSED_NI_DS:
		CALL	VERIFY_KBD
                JZ      KEY_IS_NOT_PRESSED_NI_DS
                CALL    READ_KBD
		RET
DEVICE_IS_UNLOCKED_DS:
                CALL    SELECT_PASSWORD_TYPE
                CALL    ENTER_PASSWORD_ONE
                CALL    CLR_HDD_PAS_BUF
                MOV     BYTE PTR ES:[HDD_PASSWORD_BEGIN],00
                MOV     AL,ES:[PASSWORD_TYPE]
                OR      ES:[HDD_PASSWORD_BEGIN+1],AL
                MOV     BX,HDD_PASSWORD_BEGIN+2
                MOV     SI,FIRST_PASSWORD_BUF
                MOV     CX,10H
PAK_COPY_PAS_DS:
                MOV     AX,ES:[SI]
;;;;                XCXG    AL,AH ADDED FOR ADDITIONAL ENCODINC OF PASSWORD
                MOV     ES:[BX],AX
                INC     BX
                INC     BX
                INC     SI
                INC     SI
                LOOP    PAK_COPY_PAS_DS

                MOV     BYTE PTR ES:[ATA_COMMAND],ATA_SECURITY_DISABLE_PASSWORD
                CALL    SEND_HDD_PASSWORD_BEGIN_BUFFER
                RET
;-------------------------------------------------------
UNLOCK_WITH_CTP:
		CALL	ENTER_PASSWORD_STAR
		JMP	UNL2
UNLOCK_DEVICE:
                CALL    SELECT_PASSWORD_TYPE
                CALL    ENTER_PASSWORD_ONE
UNL2:
                CALL    CLR_HDD_PAS_BUF
                MOV     BYTE PTR ES:[HDD_PASSWORD_BEGIN],00
                MOV     AL,ES:[PASSWORD_TYPE]
                OR      ES:[HDD_PASSWORD_BEGIN+1],AL
                MOV     BX,HDD_PASSWORD_BEGIN+2
                MOV     SI,FIRST_PASSWORD_BUF
                MOV     CX,10H
PAK_COPY_PAS_UD:
                MOV     AX,ES:[SI]
;;;;                XCXG    AL,AH ADDED FOR ADDITIONAL ENCODINC OF PASSWORD
                MOV     ES:[BX],AX
                INC     BX
                INC     BX
                INC     SI
                INC     SI
                LOOP    PAK_COPY_PAS_UD

                MOV     BYTE PTR ES:[ATA_COMMAND],ATA_SECURITY_UNLOCK
                CALL    SEND_HDD_PASSWORD_BEGIN_BUFFER
                RET
;-------------------------------------------------------
SELECT_PASSWORD_TYPE:
		CALL	CLRSCR
                MOV     DX,0101H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_WHAT_PASS
                CALL    WRITE_STRING
                MOV     BYTE PTR ES:[PASSWORD_TYPE],0
KEY_IS_NOT_PRESSED_SPT:
		CALL	VERIFY_KBD
                JZ      KEY_IS_NOT_PRESSED_SPT
                CALL    READ_KBD
                CMP     AL,'0'
                JE      NEXT_SPT_1
                CMP     AL,'1'
                JNE     KEY_IS_NOT_PRESSED_SPT
                MOV     BYTE PTR ES:[PASSWORD_TYPE],1
NEXT_SPT_1:

                RET
;-------------------------------------------------------
ENTER_PASSWORD_STAR:
                CALL    CLR_PASSWORD_BUFFERS
		MOV	DH,BYTE PTR ES:[CURRENT_POS_DH]
                MOV     DL,01H
                CALL    GOTOXY

                CMP     BYTE PTR ES:[PASSWORD_TYPE],1
                JE      EPS_IS_MASTER
                MOV     BX,OFFSET MESS_ENTER_U_PASSWORD_1
                CALL    WRITE_STRING
		MOV	DH,BYTE PTR ES:[CURRENT_POS_DH]
                MOV     DL,23H
                CALL    GOTOXY
                JMP     ENT_M_OR_U_EPS
EPS_IS_MASTER:
                MOV     BX,OFFSET MESS_ENTER_M_PASSWORD_1
                CALL    WRITE_STRING
		MOV	DH,BYTE PTR ES:[CURRENT_POS_DH]
                MOV     DL,25H
                CALL    GOTOXY
ENT_M_OR_U_EPS:
                MOV     BX,FIRST_PASSWORD_BUF
PAK_GET_CHAR_EPS:

                PUSH    BX
                CALL    READ_KBD
                POP     BX
                CMP     AL,0DH  ;ENTER
                JE      EPS_ENTER
                PUSHA
		CMP	AL,08	;BS
		JE	WRITE_BS_EPS
		MOV	AL,'*'
WRITE_BS_EPS:
                CALL    WRITE_CHAR
                POPA
                CMP     AL,08H  ;BS
                JNE     EPS_NO_BS
                CMP     BX,FIRST_PASSWORD_BUF
                JE      EPS_NO_BS
                MOV     BYTE PTR ES:[BX],0
                DEC     BX
                JMP     SHORT  PAK_GET_CHAR_EPS
EPS_NO_BS:
;;                XOR     AL,13
                CMP     BX,FIRST_PASSWORD_BUF+1FH
                JE      EPS_FP_FULL
                MOV     ES:[BX],AL
                INC     BX
EPS_FP_FULL:
                JMP     SHORT  PAK_GET_CHAR_EPS
EPS_ENTER:
                RET
;-------------------------------------------------------
ENTER_PASSWORD_ONE:
                CALL    CLR_PASSWORD_BUFFERS
		CALL	CLRSCR
                MOV     DX,0101H
                CALL    GOTOXY

                CMP     BYTE PTR ES:[PASSWORD_TYPE],1
                JE      EPO_IS_MASTER
                MOV     BX,OFFSET MESS_ENTER_U_PASSWORD_1
                CALL    WRITE_STRING
                MOV     DX,0123H
                CALL    GOTOXY
                JMP     ENT_M_OR_U_EPO
EPO_IS_MASTER:
                MOV     BX,OFFSET MESS_ENTER_M_PASSWORD_1
                CALL    WRITE_STRING
                MOV     DX,0125H
                CALL    GOTOXY
ENT_M_OR_U_EPO:
                MOV     BX,FIRST_PASSWORD_BUF
PAK_GET_CHAR_EPO:

                PUSH    BX
                CALL    READ_KBD
                POP     BX
                CMP     AL,0DH  ;ENTER
                JE      EPO_ENTER
                PUSHA
                CALL    WRITE_CHAR
                POPA
                CMP     AL,08H  ;BS
                JNE     EPO_NO_BS
                CMP     BX,FIRST_PASSWORD_BUF
                JE      EPO_NO_BS
                MOV     BYTE PTR ES:[BX],0
                DEC     BX
                JMP     SHORT  PAK_GET_CHAR_EPO
EPO_NO_BS:
;;                XOR     AL,13
                CMP     BX,FIRST_PASSWORD_BUF+1FH
                JE      EPO_FP_FULL
                MOV     ES:[BX],AL
                INC     BX
EPO_FP_FULL:
                JMP     SHORT  PAK_GET_CHAR_EPO
EPO_ENTER:
                RET
;-------------------------------------------------------
ENTER_PASSWORD_TWO:
                MOV     DX,0201H
                CALL    GOTOXY
                CMP     BYTE PTR ES:[PASSWORD_TYPE],1
                JE      EPT_IS_MASTER
                MOV     BX,OFFSET MESS_ENTER_U_PASSWORD_2
                CALL    WRITE_STRING
                MOV     DX,0223H
                CALL    GOTOXY
                JMP     ENT_M_OR_U_EPT
EPT_IS_MASTER:
                MOV     BX,OFFSET MESS_ENTER_M_PASSWORD_2
                CALL    WRITE_STRING
                MOV     DX,0225H
                CALL    GOTOXY
ENT_M_OR_U_EPT:
                MOV     BX,SECOND_PASSWORD_BUF
PAK_GET_CHAR_EPT:

                PUSH    BX
                CALL    READ_KBD
                POP     BX
                CMP     AL,0DH  ;ENTER
                JE      EPT_ENTER
                PUSHA
                CALL    WRITE_CHAR
                POPA
                CMP     AL,08H  ;BS
                JNE     EPT_NO_BS
                CMP     BX,SECOND_PASSWORD_BUF
                JE      EPT_NO_BS
                MOV     BYTE PTR ES:[BX],0
                DEC     BX
                JMP     SHORT  PAK_GET_CHAR_EPT
EPT_NO_BS:
;;                XOR     AL,13
                CMP     BX,SECOND_PASSWORD_BUF+1FH
                JE      EPT_FP_FULL
                MOV     ES:[BX],AL
                INC     BX
EPT_FP_FULL:
                JMP     SHORT  PAK_GET_CHAR_EPT
EPT_ENTER:
                RET
;-------------------------------------------------------
SEND_HDD_PASSWORD_BEGIN_BUFFER:
		CLI
;INPUT IDE_NUMBER, DEVICE_NUMBER,ATA_COMMAND
                MOV     AX,WORK_SEGMENT
                MOV     ES,AX

                CALL    WAIT_CURRENT_DEVICE_BUSY_FLAG
;---SELECT DEVICE ON SELECTED IDE
                MOV     DX,IDE1_DEVICE_HEAD
                SUB     DL,ES:[IDE_NUMBER]
                IN      AL,DX
                AND     AL,11101111B
                OR      AL,ES:[DEVICE_NUMBER]
                OUT     DX,AL
                CALL    WAIT_CURRENT_DEVICE_BUSY_AND_DRDY_FLAGS
;----
;----DIABLE INTERRUPTS FROM DEVICE
                MOV     DX,IDE1_DEVICE_CONTROL  ;DISABLE INT FROM DEVICE
                SUB     DL,ES:[IDE_NUMBER]
                MOV     AL,02H
                OUT     DX,AL
;----
;----SEND ATA COMMAND
		MOV	DX,IDE1_COMMAND
                SUB     DL,ES:[IDE_NUMBER]
                MOV     AL,ES:[ATA_COMMAND]
		OUT	DX,AL
		MOV	DX,IDE1_STATUS
;;;;                CALL    WAIT_CURRENT_ALTERNATE_BUSY_FLAG
;-----
;-----SEND DATA TO DEVICE
                CALL    WAIT_CURRENT_DEVICE_DRQ_FLAG
                MOV     AX,WORK_SEGMENT
		MOV	ES,AX
		MOV	DX,IDE1_DATA
                SUB     DL,ES:[IDE_NUMBER]
                MOV     BX,HDD_PASSWORD_BEGIN
		MOV	CX,100H
PAK_SEND_DATA_DEV:
                MOV     AX,ES:[BX]
		XCHG	AL,AH
		INC	BX
		INC	BX
                OUT     DX,AX
                LOOP    PAK_SEND_DATA_DEV
                CALL    WAIT_CURRENT_ALTERNATE_BUSY_FLAG
                CALL    WAIT_CURRENT_DEVICE_BUSY_FLAG
		STI
                RET
;===========================================================================
NOT_SUPPORT_SECURITY:
                MOV     DX,0301H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_SECURITY_IS_NOT_SUPPORTED
                CALL    WRITE_STRING
                MOV     DX,0501H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_WHAT
                CALL    WRITE_STRING
                MOV     DX,0701H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_EXIT
                CALL    WRITE_STRING
                MOV     DX,0801H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_ENTER_DEVICE_NUMBER
                CALL    WRITE_STRING
                MOV     DX,0901H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_ENTER_IDE_NUMBER
                CALL    WRITE_STRING
KEY_IS_NOT_PRESSED_02:
		CALL	VERIFY_KBD
                JZ      KEY_IS_NOT_PRESSED_02
                CALL    READ_KBD
                CMP     AL,'1'
                JE      TO_EXIT2
                CMP     AL,'5'
                JNE     VER_FOR_6_NSS
		CALL	ENTER_DEV_NUM
                JMP     PAK_IDENT_PM
VER_FOR_6_NSS:
                CMP     AL,'6'
                JNE     NO_6_NSS
		CALL	ENTER_IDE_NUM
                JMP     PAK_IDENT_PM
NO_6_NSS:
                JMP     SHORT   KEY_IS_NOT_PRESSED_02
TO_EXIT2:
                RET
;------------------------------------------------------------
ENTER_DEV_NUM:
		CALL	CLRSCR
                MOV     DX,0101H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_PRESS_0_OR_1
                CALL    WRITE_STRING
KEY_IS_NOT_PRESSED_032:
		CALL	VERIFY_KBD
                JZ      KEY_IS_NOT_PRESSED_032
                CALL    READ_KBD
                CMP     AL,'0'
                JNE     VER_FOR_RK1
                MOV     BYTE PTR ES:[DEVICE_NUMBER],DEV_0_CONST
		RET
VER_FOR_RK1:
                CMP     AL,'1'
                JNE     ENTER_DEV_NUM
                MOV     BYTE PTR ES:[DEVICE_NUMBER],DEV_1_CONST
		RET
;------------------------------------------------------------
ENTER_IDE_NUM:
		CALL	CLRSCR
                MOV     DX,0101H
                CALL    GOTOXY
                MOV     BX,OFFSET MESS_PRESS_1_OR_2
                CALL    WRITE_STRING
KEY_IS_NOT_PRESSED_043:
		CALL	VERIFY_KBD
                JZ      KEY_IS_NOT_PRESSED_043
                CALL    READ_KBD
                CMP     AL,'1'
                JNE     VER_FOR_RK2
                MOV     BYTE PTR ES:[IDE_NUMBER],IDE_1_CONST
		RET
VER_FOR_RK2:
                CMP     AL,'2'
                JNE     ENTER_IDE_NUM
                MOV     BYTE PTR ES:[IDE_NUMBER],IDE_2_CONST
		RET
;------------------------------------------
IDENT_DEVICE:
;INPUT IDE_NUMBER, DEVICE_NUMBER
                MOV     AX,WORK_SEGMENT
                MOV     ES,AX
		CALL	CLR_HDD_INFO_BUF

                CALL    WAIT_CURRENT_DEVICE_BUSY_FLAG
		CMP	CX,0
		JE	ERR_ID_DEV
;---SELECT DEVICE ON SELECTED IDE
                MOV     DX,IDE1_DEVICE_HEAD
                SUB     DL,ES:[IDE_NUMBER]
                IN      AL,DX
                AND     AL,11101111B
                OR      AL,ES:[DEVICE_NUMBER]
                OUT     DX,AL
                CALL    WAIT_CURRENT_DEVICE_BUSY_AND_DRDY_FLAGS
		CMP	CX,0
		JE	ERR_ID_DEV
;----
;----DIABLE INTERRUPTS FROM DEVICE
                MOV     DX,IDE1_DEVICE_CONTROL  ;DISABLE INT FROM DEVICE
                SUB     DL,ES:[IDE_NUMBER]
                MOV     AL,02H
                OUT     DX,AL
;----
;----SEND INDENTIFY COMMAND
		MOV	DX,IDE1_COMMAND
                SUB     DL,ES:[IDE_NUMBER]
		MOV	AL,ATA_IDENTIFY_DEVICE
		OUT	DX,AL
		MOV	DX,IDE1_STATUS
                CALL    WAIT_CURRENT_ALTERNATE_BUSY_FLAG
		CMP	CX,0
		JE	ERR_ID_DEV
;-----
;-----GET DATA FROM DEVICE
                CALL    WAIT_CURRENT_DEVICE_DRQ_FLAG
		CMP	CX,0
		JE	ERR_ID_DEV
                MOV     AX,WORK_SEGMENT
		MOV	ES,AX
		MOV	DX,IDE1_DATA
                SUB     DL,ES:[IDE_NUMBER]
		MOV	BX,HDD_INFO_BEGIN
		MOV	CX,100H
PAK_GET_DATA_IDENTIFY:
		IN	AX,DX
		XCHG	AL,AH
		MOV	ES:[BX],AX
		INC	BX
		INC	BX
		LOOP	PAK_GET_DATA_IDENTIFY
                RET
ERR_ID_DEV:
		MOV	CX,0FFFEH
		RET
;------------------------------------------
WAIT_CURRENT_DEVICE_DRQ_FLAG:
		XOR	CX,CX
		CALL	STORE_WAIT_1S
                MOV     DX,IDE1_STATUS
                SUB     DL,ES:[IDE_NUMBER]
DEVICE_NO_HAVE_DATA:
		CALL	COMP_WAIT_1S
		JA	ERR_DRQ
		IN	AL,DX
                TEST    AL,08H
                JZ      DEVICE_NO_HAVE_DATA       ;DRQ=0
		DEC	CX
		RET
ERR_DRQ:
                RET
;------------------------------------------
WAIT_CURRENT_ALTERNATE_BUSY_FLAG:
		XOR	CX,CX
		CALL	STORE_WAIT_1S
                MOV     DX,IDE1_ALTERNATE_STATUS
                SUB     DL,ES:[IDE_NUMBER]
DEVICE_IS_BUSY1AL:
		CALL	COMP_WAIT_1S
		JA	ERR_ABF
		IN	AL,DX
		TEST	AL,80H
                JNZ     DEVICE_IS_BUSY1AL
		DEC	CX
                RET
ERR_ABF:
                RET
;------------------------------------------
WAIT_CURRENT_DEVICE_BUSY_FLAG:
		XOR	CX,CX
		CALL	STORE_WAIT_1S
                MOV     DX,IDE1_STATUS
                SUB     DL,ES:[IDE_NUMBER]
DEVICE_IS_BUSY1:
		CALL	COMP_WAIT_1S
		JA	ERR_DBF
		IN	AL,DX
		TEST	AL,80H
                JNZ     DEVICE_IS_BUSY1
		DEC	CX
		RET
ERR_DBF:
                RET
;------------------------------------------
WAIT_CURRENT_DEVICE_BUSY_AND_DRDY_FLAGS:
		XOR	CX,CX
		CALL	STORE_WAIT_1S
                MOV     DX,IDE1_STATUS
                SUB     DL,ES:[IDE_NUMBER]
DEVICE_IS_BUSY1_1:
		CALL	COMP_WAIT_1S
		JA	ERR_DBDF
		IN	AL,DX
                TEST    AL,80H
                JNZ     DEVICE_IS_BUSY1_1 ;BUSY=1
                TEST    AL,40H
                JZ      DEVICE_IS_BUSY1_1 ;DRDY=0
		DEC	CX
		RET
ERR_DBDF:
                RET
;------------------------------------------
READ_KBD:
                PUSH    ES
		MOV	AH,0
                INT     16H
                POP     ES
		RET
;------------------------------------------
VERIFY_KBD:
                PUSH    ES
		MOV	AH,01H
                INT     16H
                POP     ES
		RET
;------------------------------------------
WAIT_3S:
                PUSH    ES
		MOV	AH,0
		INT	1AH
                MOV     AX,WORK_SEGMENT
                MOV     ES,AX
                MOV     ES:[TEMP1],DX

PAK_WAIT_3S:
		CALL	VERIFY_KBD
		JNZ	KEY_IS_PRESSED_02
		MOV	AH,0
		INT	1AH
                SUB     DX,ES:[TEMP1]
		CMP	DX,18*SECONDS_FOR_WAIT
		JB	PAK_WAIT_3S
KEY_IS_PRESSED_02:
                POP     ES
		RET
;------------------------------------------
STORE_WAIT_1S:
		PUSH	ES
		PUSHA
		MOV	AH,0
		INT	1AH
                MOV     AX,WORK_SEGMENT
                MOV     ES,AX
                MOV     ES:[TEMP1],DX
		POPA
		POP	ES
		RET
COMP_WAIT_1S:
		PUSH	ES
		PUSHA
                MOV     AX,WORK_SEGMENT
                MOV     ES,AX
		MOV	AH,0
		INT	1AH
                SUB     DX,ES:[TEMP1]
		CMP	DX,18
		POPA
		POP	ES
		RET
;----------------CLRSCR--------------------
CLRSCR:
                PUSH    ES
		MOV	AX,0003H
                INT     10H
                POP     ES
		RET
;------------------------------------------
GOTOXY:
;DH=ROW=X
;DL=COLUMN=Y(0=CURRENT)
                PUSH    ES
		MOV	BH,0	;CURRENT PAGE
		MOV	AH,02
                INT     10H
                POP     ES
		RET
;------------------------------------------
WRITE_STRING:
;STRING END IS 0
;CS:BX->STRING POINTER
                PUSH    ES
WRITE_STR2:
                PUSH    CS
                POP     ES
		MOV	AL,ES:[BX]
		CMP 	AL,0
		JE	END_OF_STRING
		INC	BX
		PUSHA
		MOV	AH,0EH
		MOV	BL,03H	;CYAN
		INT	10H
		POPA
                JMP     SHORT WRITE_STR2
END_OF_STRING:
                POP     ES
		RET
;------------------------------------------
CONV_4HEX_4ASCII:
;IN AX OUT AX=HI,DX=LO
                PUSH    AX
                CALL    CONV_2HEX_2ASCII
                MOV     DX,AX
                POP     AX
                XCHG    AH,AL
                CALL    CONV_2HEX_2ASCII
                RET

CONV_2HEX_2ASCII:
;IN AL OUT AH=LO AL=HI
                MOV     BL,AL
                AND     AL,0FH
                CALL    CONV_1HEX_1ASCII
                MOV     AH,AL

                MOV     AL,BL
                SHR     AL,4
                CALL    CONV_1HEX_1ASCII
;;                XCHG    AH,AL
                RET

CONV_1HEX_1ASCII:
;IN AL OUT AL
                CMP     AL,0AH
                CMC
                ADC     AL,30H
                DAA
                RET
;------------------------------------------
WRITE_STRING_WITH_ES:
;STRING END IS 0
;ES:BX->STRING POINTER
                PUSH    ES
WRITE_STR2ES:
		MOV	AL,ES:[BX]
		CMP 	AL,0
                JE      END_OF_STR2
		INC	BX
		PUSHA
		MOV	AH,0EH
		MOV	BL,03H	;CYAN
		INT	10H
		POPA
                JMP     SHORT WRITE_STR2ES
END_OF_STR2:
                POP     ES
		RET
;------------------------------------------
WRITE_CHAR:
;INPUT AL
                PUSH    ES
		PUSHA
		MOV	AH,0EH
		MOV	BL,03H	;CYAN
		INT	10H
                POPA
                POP     ES
		RET
;-------------------------------------------
CLR_PASSWORD_BUFFERS:
                MOV     BX,FIRST_PASSWORD_BUF
                MOV     CX,40H
                XOR     AX,AX
PAK_CLR_1P_BUF:
                MOV     ES:[BX],AL
		INC	BX
                LOOP    PAK_CLR_1P_BUF
                RET
;----------------------
CLR_HDD_PAS_BUF:
                MOV     BX,HDD_PASSWORD_BEGIN
                MOV     CX,100H
                XOR     AX,AX
PAK_CLR_DATA_BUF:
                MOV     ES:[BX],AX
		INC	BX
		INC	BX
                LOOP    PAK_CLR_DATA_BUF
                RET
;----------------------
CLR_HDD_INFO_BUF:
                MOV     BX,HDD_INFO_BEGIN
                MOV     CX,100H
                XOR     AX,AX
PAK_CLR_INFO_BUF:
                MOV     ES:[BX],AX
		INC	BX
		INC	BX
                LOOP    PAK_CLR_INFO_BUF
                RET
;---------------------------------------------------
PRINT_DEVICE_NAME:
                MOV     DL,1EH
		MOV	DH,BYTE PTR ES:[CURRENT_POS_DH]
                CALL    GOTOXY
                MOV     BX,HDD_INFO_BEGIN+(27*2)
		MOV	WORD PTR ES:[HDD_INFO_BEGIN+(46*2)],0000H
                CALL    WRITE_STRING_WITH_ES
                MOV     DL,05H
		MOV	DH,BYTE PTR ES:[CURRENT_POS_DH]
		CALL	GOTOXY
		MOV	AH,ES:[DEVICE_NUMBER]
		CMP	AH,DEV_0_CONST
		JNE	NO_DEV_0_E1
		MOV     AL,'0'
		CALL	WRITE_CHAR
NO_DEV_0_E1:
		MOV	AH,ES:[DEVICE_NUMBER]
		CMP	AH,DEV_1_CONST
		JNE	NO_DEV_1_E1
		MOV     AL,'1'
		CALL	WRITE_CHAR
NO_DEV_1_E1:
                MOV     DL,0BH
		MOV	DH,BYTE PTR ES:[CURRENT_POS_DH]
		CALL	GOTOXY
		MOV	AH,ES:[IDE_NUMBER]
		CMP	AH,IDE_1_CONST
		JNE	NO_IDE_1_E1
		MOV     AL,'1'
		CALL	WRITE_CHAR
NO_IDE_1_E1:
		MOV	AH,ES:[IDE_NUMBER]
		CMP	AH,IDE_2_CONST
		JNE	NO_IDE_2_E1
		MOV     AL,'2'
		CALL	WRITE_CHAR
NO_IDE_2_E1:
                MOV     DL,1AH
		MOV	DH,BYTE PTR ES:[CURRENT_POS_DH]
		CALL	GOTOXY
                MOV     AH,BYTE PTR ES:[HDD_INFO_BEGIN+(80*2)]
                MOV     AL,BYTE PTR ES:[HDD_INFO_BEGIN+1+(80*2)]
                CMP     AX,0000H
                JE      NO_ATA_VER
                CMP     AX,0FFFFH
                JE      NO_ATA_VER
                MOV     CX,15
PAK_SH_AX:
                SAL     AX,1
                JC      CALC_VER_ATA
                LOOP    PAK_SH_AX
CALC_VER_ATA:
                ADD     CL,'0'
                CMP     CL,':'
                JB      PRINT_ATA_VER
                ADD     CL,7
PRINT_ATA_VER:
                MOV     AL,CL
                CALL    WRITE_CHAR
NO_ATA_VER:
		RET
;===================================================
MESS_VERSION:	DB	'DBIOS v1.14',0
MESS_CURRENT_DEVICE:
                DB      'Dev X IDE X is ATA/ATAPI-?                                            ',0
                ;        123456789ABCDEF0123456789ABCDEF
MESS_SECURITY_SET_INFORMATION:
		DB	'Device SECURITY SET information:  ',0
                ;        123456789ABCDEF0123456789ABCDEF
MESS_ENABLED:	DB	' %ENABLED',0
                ;        123456789ABCDEF0123456789ABCDEF
MESS_DISABLED:  DB	' %DISABLED',0
                ;        123456789ABCDEF0123456789ABCDEF
MESS_SUPPORTED: DB      ' %SUPPORTED',0
                ;        123456789ABCDEF0123456789ABCDEF
MESS_NOT_SUPPORTED:
		DB	' %NOT_SUPPORTED',0
                ;        123456789ABCDEF0123456789ABCDEF
MESS_SECURITY_STATUS:
		DB	'Device SECURITY status: ',0
MESS_LOCKED:	DB	' #LOCKED',0
MESS_UNLOCKED:	DB	' #UNLOCKED',0
MESS_HILEVEL:	DB	' #HIlevel',0
MESS_MAXLEVEL:	DB	' #MAXlevel',0
MESS_FROZEN:	DB	' #FROZEN',0
MESS_NOT_FROZEN:
                DB      ' #NOT_FROZEN',0
MESS_SMS_ENABLED:
		DB	' #ENABLED by SET MAX SET PASSWORD',0

MESS_HOST_PROT_AREA_INF:
		DB	'Host protected area feature (SET MAX SET) inf:',0
MESS_HOST_PROT_AREA_STATUS:
		DB	'Host protected area feature (SET MAX SET) status:',0
MESS_SMS_NOT:
		DB	' #NOT_ACTIVE',0
MESS_ENH_SEC_ERASE:
		DB	'Enhanced security erase inf:',0
MESS_PASSWORD_COUNTER_EXPIRED:
                DB      'Password counter EXPIRED you MUST off/on the device power',0
MESS_PASSWORD_COUNTER_OK:
                DB      'Password counter OK',0
MESS_WHAT:
                DB      'WHAT DO YOU WANT TO DO?',0
MESS_EXIT:
                DB      '1 EXIT AND CONTINUE BOOT',0
MESS_ENTER_USER_PASSWORD:
                DB      '2 SET USER PASSWORD & LOCK THIS DEVICE ON NEXT POWER ON',0
MESS_ENTER_MASTER_PASSWORD:
                DB      '3 SET MASTER PASSWORD (IF YOU KONOW WHAT DO YOU WANT)',0
MESS_DISABLE_SECURITY:
                DB      '4 DISABLE SECURITY',0
MESS_ENTER_DEVICE_NUMBER:
                DB      '5 ENTER DEVICE NUMBER 0 OR 1',0
MESS_ENTER_IDE_NUMBER:
                DB      '6 ENTER IDE NUMBER 1 OR 2',0
MESS_UNLOCK_DEVICE:
                DB      '7 UNLOCK THIS DEVICE',0
MESS_ERASE_PASSWORD:
                DB      '0 ERASE PASSWORD (DESTROY ALL DATA ON THE DEVICE!!)',0
MESS_ENTER_U_PASSWORD_1:
                DB      'ENTER USER PASSWORD 32 CHARS MAX->',0
                ;        123456789ABCDEF0123456789ABCDEF01234
MESS_ENTER_U_PASSWORD_2:
                DB      'ENTER SAME USER PASSWORD AGAIN  ->',0
MESS_ENTER_M_PASSWORD_1:
                DB      'ENTER MASTER PASSWORD 32 CHARS MAX->',0
                ;        123456789ABCDEF0123456789ABCDEF0123456
MESS_ENTER_M_PASSWORD_2:
                DB      'ENTER SAME MASTER PASSWORD AGAIN  ->',0
MESS_PASSWORD_NO_IDENT:
                DB      'PASSWORDS ARE NOT IDENTICAL',0
MESS_PASSWORD_FAILED:
                DB      'DEVICE NOT ACCEPT THIS PASSWORD',0
MESS_PRESS_A_KEY:
                DB      'PRESS A KEY',0
MESS_PRESS_0_OR_1:
                DB      'Press 0 or 1',0
MESS_PRESS_1_OR_2:
                DB      'PRESS 1 OR 2',0
MESS_ENTER_SECURITY_LEVEL:
		DB	'Enter security level 0=HIGH LEVEL 1=MAXIMUM LEVEL',0
MESS_NOTE_SL:
		DB	'Note: if level=HIGH then device MAY BE UNLOCKED with MASTER password, if level=MAXIMUM and USER password is lost, then data access is IMPOSIBLE',0
MESS_DEV_IS_LOCKED:
		DB	'This device is LOCKED, UNLOCK it first!',0
MESS_MAST_PASS_REV:
		DB	'Master password REVISION:',0
MESS_ERASING:	DB	'Erasing... ',0
MESS_PROGRESS:  DB      'PROGRESS->',0
MESS_WHAT_PASS: DB      'What password will be used? Press 0 for USER or 1 for MASTER',0
MESS_SECURITY_IS_NOT_SUPPORTED:
                DB      'Device is NOT SUPPORT security',0
MESS_0ORF_NO:   DB      ' (0000 OR FFFF ARE NOT VALID) ',0
MESS_QUEST_MP:	DB	'Do You want to enter MASTER PASSWORD? 1=YES(recomended!) 0=NO ',0
MESS_ERR_IDENT: DB      'ERROR WITH DEVICE IDENTIFY',0
                DB      '/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\'
CODE 		ENDS

		END START
