/*
Keypad Backlight By NeO_2kX.
Работоспособен только при установленном EEPROM Api By NeO_2kX!
Не для коммерческого использования!
*/

.binid X100XEDG1
.include "ExtendedApi.h"
.include "KeyPad.h"

@ExtendedApi Handlers
.org __my0_5task_Table+0x64*4
	DCD		my0_5task_0064+1
.org __my0_4if_Table+0x64*4
	DCD		my0_5if_0064+1
.org ExtTextHandler_Table+0x64*4
	DCD		my_0_5get_text_0064+1

@Расширение заголовков для окон редактирования времени	
.start 0x000B622C
BL		My_Extended_DateTimeInputTitle
NOP	
	
@Переход на новый обработчик подсказок(меню стандартного типа)
.start 0x000ACD82
BL 		GetDefaultMenuValue_4_2_3_Sub
B 		0x000ACEA2

@Правка функции включение подсветки
.start 0x00128A40
BL 		lk_CheckKeypadLightEnable
B  		exit_hen7_80SwitchOnMainlight
@Сингатура патча
.byte	"KP1"

@Устранение конфликта меню "Подстветка дисплея"
.start 0x007EDA98
.mcc MCC_MENU 		0xA 0x43D 	0x5 0x34
.mcc MCC_ENAVIGSA 	0xA 0x5 	0 	0 	mcc_set_backlight_15sec 	0x43D
.mcc MCC_ENAVIGA 	0xA 0x5 	0x1 0 	mcc_set_backlight_30sec 	0x43E
.mcc MCC_ENAVIGA 	0xA 0x5 	0x2 0 	mcc_set_backlight_1min 		0x43F
.mcc MCC_ENAVIGA 	0xA 0x5 	0x3 0 	mcc_set_backlight_3min 		0x440
.mcc MCC_ENAVIGEA 	0xA 0x5 	0x4 0 	mcc_set_backlight_10min 	0x441

.start mcc_set_backlight
.mcc MCC_TRANSF 0 0 0 0 mcc_backlight_menu

@Основной блок патча
.start KeyPad_Start
.string "<Keypad Backlight By NeO_2kX>"

.align 1
@void lk_CheckKeypadLightEnable(void);
lk_CheckKeypadLightEnable:
.equ lk_CheckKeypadLightEnable_StackSize #8
PUSH 	{R0-R4, LR}
SUB 	SP, SP, #lk_CheckKeypadLightEnable_StackSize

@Получение текущего режима подсветки
	BL		Get_Cur_Backlight_Mode

@Ручной режим ?	
	CMP		R0, #1
	BEQ		lk_CheckKeypadLightEnable_Manual_Time_Read
	
@Использовать в любое время ?	
	CMP 	R0, #2
	BEQ		lk_KeypadLightEnable

@Не использовать ?	
	CMP		R0, #3
	BEQ		lk_KeypadLightDisable

@Получение времени
	ADD 	R0, SP, #0
	BL 		RtcGetTime		 				@(char* buf):{sec,min,hour, 0,0}

@Чтение часа
	ADD		R0, SP, #0
	LDRB 	R0, [R0, #2]

@До 9
	CMP 	R0, #9
	BLT		lk_KeypadLightEnable

@После 17
	CMP 	R0, #17
	BLT 	lk_KeypadLightDisable

lk_KeypadLightEnable:
	BL 		Hard_KeypadBacklightOn
	B		exit_lk_CheckKeypadLightEnable

lk_KeypadLightDisable:
	BL 		Hard_KeypadBacklightOff

exit_lk_CheckKeypadLightEnable:
ADD 	SP, SP, #lk_CheckKeypadLightEnable_StackSize
POP 	{R0-R4, PC}


lk_CheckKeypadLightEnable_Manual_Time_Read:
	ADD 	R0, SP, #0
	BL 		RtcGetTime		 				@(char* buf):{sec,min,hour, 0,0}
	
	ADD		R0, SP, #0
	LDRB	R3, [R0, #2]					@R3 == текущий час
	LDRB	R4, [R0, #1]					@R4 == текущие минуты
	MOV		R0, #60
	MUL		R3, R0							@R3 == текущий чаc в минутах
	ADD		R3, R3, R4						@R3 == текущее время в минутах
	
	MOV		R0, #0
	BL		Get_Save_Time
	LDRB	R1, [R0, #2]					@R1 == часы после
	LDRB	R4, [R0, #1]					@R4 == минуты после
	MOV		R0, #60
	MUL		R1,	R0							@R1 == часы после в минутах
	ADD		R1, R1, R4						@R1 == время после в минутах
		
	MOV 	R0, #1
	BL		Get_Save_Time
	LDRB	R2, [R0, #2]					@R2 == часы до
	LDRB	R4, [R0, #1]					@R4 == минуты до
	MOV		R0, #60
	MUL		R2,	R0							@R2 == часы до в минутах
	ADD		R2, R2, R4						@R2 == время до в минутах
		
	CMP		R1, R2							
	BGT		lk_Manual_Time_Read_Big_Period
	BEQ		lk_Manual_Time_Read_equal_Period

@Если начальное время < конечного		
	CMP		R3, R1 							
	BLT		lk_KeypadLightDisable
	
	CMP		R3, R2							
	BLT		lk_KeypadLightEnable
		
	B		lk_KeypadLightDisable

@Если начальное время > конечного
lk_Manual_Time_Read_Big_Period:
	CMP		R3, R2							
	BLT		lk_KeypadLightEnable
	
	CMP		R3, R1							
	BLT		lk_KeypadLightDisable
	
	B		lk_KeypadLightEnable

@Если начальное время == конечному	=> 	выключить подсветку клавиатуры
lk_Manual_Time_Read_equal_Period:
	B		lk_KeypadLightDisable

@Выключение подсветки клавиатуры
@void Hard_KeypadBacklightOff(void);
Hard_KeypadBacklightOff:
PUSH	{R0-R1, R3, LR}
	LDR		R0, =0xFFFF8400
	LDRH	R1, [R0, #10]
	MOV		R3, #0xFF
	ADD		R3, #0x1
	BIC		R1, R3
	STRH	R1, [R0, #10]
POP		{R0-R1, R3, PC}
.data

@Включение подсветки клавиатуры
@void Hard_KeypadBacklightOn(void);
Hard_KeypadBacklightOn:
PUSH	{R0-R1, R3, LR}
	LDR		R0, =0xFFFF8400
	LDRH	R1, [R0, #10]
	MOV		R3, #0xFF
	ADD		R3, #0x1
	ORR		R1, R3
	STRH	R1, [R0, #10]
POP		{R0-R1, R3, PC}
.data

My_Extended_DateTimeInputTitle:
PUSH	{LR}
	CMP 	R0, #7
	BGT		My_Extended_DateTimeInputTitle_exit
	
	CMP		R0, #7
	BEQ		My_Extended_DateTimeInputTitle_Up_To_Get
	
	LDR		R0, =0x2647						@После
	B		My_Extended_DateTimeInputTitle_Get
	
My_Extended_DateTimeInputTitle_Up_To_Get:
	LDR		R0, =0x2648						@До
	
My_Extended_DateTimeInputTitle_Get:
	BL		lk_get_text
	MOV		R7, R0

My_Extended_DateTimeInputTitle_exit:
	MOV	R0, #0x18
	BL	lk_get_sofk
POP		{PC}
.data

.string "<my0_5task_0064>"
.align 1
my0_5task_0064:
PUSH 	{R1-R7, LR}
	MOV		R7, R0
	LDRH	R0, [R0, #4]
.case R0, exit_my0_5task_0064, Call_KeypadBacklight_Menu_Func Call_KeypadBacklight_Mode_Menu_Func Call_KeypadBacklight_Mode_Menu_Save_Func Call_KeypadBacklight_Mode_Menu_Set Call_KeypadBacklight_Time_Init Call_KeypadBacklight_Time_Save

exit_my0_5task_0064:
POP 	{R1-R7, PC}

Call_KeypadBacklight_Menu_Func:
	BL 		KeypadBacklight_Menu_Func
	B		exit_my0_5task_0064

Call_KeypadBacklight_Mode_Menu_Func:
	BL 		KeypadBacklight_Mode_Menu_Func
	B		exit_my0_5task_0064
	
Call_KeypadBacklight_Mode_Menu_Save_Func:
	BL		KeypadBacklight_Mode_Menu_Save_Func
	B		exit_my0_5task_0064
	
Call_KeypadBacklight_Mode_Menu_Set:
	BL		KeypadBacklight_Mode_Menu_Set
	B		exit_my0_5task_0064	
	
Call_KeypadBacklight_Time_Init:
	BL		KeypadBacklight_Time_Init
	B		exit_my0_5task_0064
	
Call_KeypadBacklight_Time_Save:
	BL		KeypadBacklight_Time_Save
	B		exit_my0_5task_0064

@Функция заполнения меню "Подстветка клавиатуры"
KeypadBacklight_Menu_Func:
.equ KeypadBacklight_Stack_Size	#16
PUSH 	{R1-R4, LR}
SUB 	SP, SP, #KeypadBacklight_Stack_Size

@Прорисовка заголовка
	LDR 	R0, =0x2641						@Подстветка клавиатуры
	BL		lk_get_text	
	MOV 	R2, #0
	MOV 	R1, #0	
	BL		Reg_Draw_Title					@{Title_Str_Adress, ?(0), ?(0)}

@Прорисовка софт-клавиш
	MOV		R0, #0x2D						@Выбор
	BL		lk_get_sofk						@{SK_RES_ID}:Adress
	MOV		R3, #0x11						@Иконка выход
	MOV		R2, #0
	MOV		R1, #0
	STR		R1, [SP, #0]
	STR		R1, [SP, #0x4]
	STR		R1, [SP, #0x8]
	BL		Reg_Draw_Softkey				@{1_sk, IconTimerID_1_Sk, 2_sk, IconTimerID_2_Sk, [SP] - Midle_SK, [SP, #4] - IconTimerID_Midle_Sk, [SP, #8] - ?(0)}

	LDR		R4, =DspList	
	MOV		R3, #0
	MOV 	R2, #3
	MOV		R1, #1
	ADD 	R0, R4, #0
	BL		CreateList 						@{DspList struct, Type, Num_of_items, 0}

@Первый пункт "Режим"
	LDR 	R0, =0x2642
	BL		lk_get_text
	MOV 	R1, #0
	BL 		My_Add_Func						@{Str, num_item}

@Подсказка первого пункта
	BL		Get_Cur_Backlight_Mode
	MOV		R1, R0
	STR		R1, [SP]

	CMP 	R1, #4
	BLT		KeypadBacklight_Menu_Func_Hint_1
	MOV		R1, #0

KeypadBacklight_Menu_Func_Hint_1:	
	LDR 	R0, =0x2643
	ADD		R0, R0, R1
	BL		lk_get_text
	MOV 	R1, #0
	BL 		My_Add_Hint_Func				@{Hint_Str, num_item}
	
@Второй пункт "После"	
	LDR 	R0, =0x2647
	BL		lk_get_text
	MOV 	R1, #1
	BL 		My_Add_Func						@{Str, num_item}
	
	LDR 	R0, [SP]						@R0 = режим

@Ночной режим ?	
	CMP 	R0, #0
	BEQ		KeypadBacklight_Menu_Func_After_Night

@Ручной режим ?	
	CMP		R0, #1
	BEQ		KeypadBacklight_Menu_Func_After_Manual
	
	MOV		R1, #0							@Min
	MOV		R0, #0							@Hour
	BL		Make_Time_Format				@*Org_SysTime Make_Time_Format_Str(hour,min)
	MOV		R1, #1
	BL		Make_Time_String				@*TimeBuf Make_Time_String(*Org_SysTime, string_type)
	B		KeypadBacklight_Menu_Func_Add_After_Hint
	
KeypadBacklight_Menu_Func_After_Night:
	MOV		R1, #0							@Min
	MOV		R0, #17							@Hour
	BL		Make_Time_Format				@*Org_SysTime Make_Time_Format_Str(hour,min)
	MOV		R1, #1
	BL		Make_Time_String				@*TimeBuf Make_Time_String(*Org_SysTime, string_type)
	B		KeypadBacklight_Menu_Func_Add_After_Hint
	
KeypadBacklight_Menu_Func_After_Manual:
	MOV		R0, #0
	MOV		R1, #1
	BL		Get_Save_Time_String			@*TimeBuf Get_Save_Time_String(time_id, type)
	
KeypadBacklight_Menu_Func_Add_After_Hint:	
	MOV 	R1, #1
	BL 		My_Add_Hint_Func				@{Hint_Str, num_item}
	
@Третий пункт "До"		
	LDR 	R0, =0x2648
	BL		lk_get_text
	MOV 	R1, #2
	BL 		My_Add_Func						@{Str, num_item}
	
	LDR 	R0, [SP]						@R0 = режим
	
@Ночной режим ?	
	CMP 	R0, #0
	BEQ		KeypadBacklight_Menu_Func_Up_To_Night

@Ручной режим ?	
	CMP		R0, #1
	BEQ		KeypadBacklight_Menu_Func_Up_To_Manual
	
	MOV		R1, #0							@Min
	MOV		R0, #0							@Hour
	BL		Make_Time_Format				@*Org_SysTime Make_Time_Format_Str(hour,min)
	MOV		R1, #1
	BL		Make_Time_String				@*TimeBuf Make_Time_String(*Org_SysTime, string_type)
	B		KeypadBacklight_Menu_Func_Add_Up_To_Hint
	
KeypadBacklight_Menu_Func_Up_To_Night:
	MOV		R1, #0							@Min
	MOV		R0, #9							@Hour
	BL		Make_Time_Format				@*Org_SysTime Make_Time_Format_Str(hour,min)
	MOV		R1, #1
	BL		Make_Time_String				@*TimeBuf Make_Time_String(*Org_SysTime, string_type)
	B		KeypadBacklight_Menu_Func_Add_Up_To_Hint
	
KeypadBacklight_Menu_Func_Up_To_Manual:
	MOV		R0, #1
	MOV		R1, #1
	BL		Get_Save_Time_String			@*TimeBuf Get_Save_Time_String(time_id, type)

KeypadBacklight_Menu_Func_Add_Up_To_Hint:	
	MOV 	R1, #2
	BL 		My_Add_Hint_Func				@{Hint_Str, num_item}

ADD 	SP, SP, #KeypadBacklight_Stack_Size
POP 	{R1-R4, PC}
.data

@Меню "Режим"
KeypadBacklight_Mode_Menu_Func:
.equ KeypadBacklight_Mode_Menu_Func_Item_Num #4
PUSH 	{R1-R4,R6-R7, LR}
SUB 	SP, SP, #0xC

@Прорисовка заголовка
	LDR 	R0, =0x2642
	BL		lk_get_text	
	MOV 	R2, #0
	MOV 	R1, #0	
	BL		Reg_Draw_Title					@{Title_Str_Adress, ?(0), ?(0)}

@Прорисовка софт-клавиш
	MOV		R0, #0x2D						@Выбор
	BL		lk_get_sofk						@{SK_RES_ID}:Adress
	MOV		R3, #0x11						@Иконка выход
	MOV		R2, #0
	MOV		R1, #0
	STR		R1, [SP, #0]
	STR		R1, [SP, #0x4]
	STR		R1, [SP, #0x8]
	BL		Reg_Draw_Softkey				@{1_sk, IconTimerID_1_Sk, 2_sk, IconTimerID_2_Sk, [SP] - Midle_SK, [SP, #4] - IconTimerID_Midle_Sk, [SP, #8] - ?(0)}
	
@Создание "листа"	
	LDR		R4, =DspList	
	MOV		R3, #0
	MOV 	R2, #KeypadBacklight_Mode_Menu_Func_Item_Num
	MOV		R1, #3							@Type == Radio
	ADD 	R0, R4, #0
	BL		CreateList 						@{DspList struct, Type, Num_of_items, 0}

@Счетчик	
	MOV		R7, #0
@Параметр
	LDR 	R6, =0x2643

KeypadBacklight_Mode_Menu_Loop:	
	ADD		R0, R6, R7
	BL		lk_get_text
	ADD		R1, R7, #0
	BL 		My_Add_Func						@{Str, num_item}

@Увеличение счетчика	
	ADD		R7, R7, #1
	
	CMP		R7, #KeypadBacklight_Mode_Menu_Func_Item_Num
	BNE		KeypadBacklight_Mode_Menu_Loop

ADD 	SP, SP, #0xC
POP		{R1-R4,R6-R7, PC}
.data

KeypadBacklight_Mode_Menu_Save_Func:
PUSH 	{R0, LR}
	BL		Get_Selected_Num				@Получение выбранного режима	
	BL		Save_Cur_Backlight_Mode			@Сохранение режима
	BL		lk_CheckKeypadLightEnable		@Выполнение текущего режима
POP		{R0, PC}

KeypadBacklight_Mode_Menu_Set:
PUSH 	{R0-R1, LR}
	BL		Get_Cur_Backlight_Mode			@Загрузка режима
	BL		SetCurList						@Установка начального пункта(режима)
POP 	{R0-R1, PC}

@MCC для инициализации буфера редактирования часов
KeypadBacklight_Time_Init:
PUSH 	{R1-R3, LR}
SUB		SP, SP, #8
	BL		lk3_0InitEditBuffer
	
	LDRH	R0, [R7, #6]
	CMP		R0, #1							@3-ий параметр mcc == 1 ?
	BEQ		KeypadBacklight_Time_Up_To_Init

	MOV		R0, #0

KeypadBacklight_Time_Init_Start:
	MOV		R1, #0	
	BL		Get_Save_Time_String			@*TimeBuf Get_Save_Time_String(time_id, type)

	BL		lk3_2WriteEditBuffer
ADD		SP, SP, #8
POP		{R1-R3, PC}

KeypadBacklight_Time_Up_To_Init:
@До
	MOV		R0, #1
	B		KeypadBacklight_Time_Init_Start
.data

KeypadBacklight_Time_Save:
PUSH	{R1-R7, LR}
SUB		SP, SP, #8
	MOV		R0, #1
	BL		lk3_1SetEditBufferPosition		@Установка позиции
	
	BL		lk3_3ReadEditBuffer
	MOV		R4, R0							@R4 == ссылка на буфер
	
	MOV		R1, #0
	STRB	R1, [R0, #2]					@Зануление ":" для корректного результата atoi
	
	MOV		R0, R4
	BL		atoi							@Получение часа
	MOV		R5, R0							@R5 == int час
	
	ADD		R0, R4, #3
	BL		atoi							@Получение минут
	MOV		R4, R0							@R4 == int минута
	
	BL		GetCurTimeFormat
	CMP		R0, #1
	BEQ		KeypadBacklight_Time_Save_12_Convert

KeypadBacklight_Time_Save_Start:	
	ADD		R0, SP, #0
	STRB	R4, [R0, #2]
	STRB	R5, [R0, #3]
	
	LDRH	R0, [R7, #6]					
	CMP		R0, #1							@3-ий параметр mcc == 1 ?
	BEQ		KeypadBacklight_Time_Up_To_Save

@После
	MOV		R0, #2							@Смещение == 2		

KeypadBacklight_Time_Save_Write:	
	LDR		R2, [SP]
	MOV 	R1, #1							@Запись полуслова
	BL		Write_EEPROM

@Проверка режима подсветки 	
	BL		lk_CheckKeypadLightEnable
	
ADD		SP, SP, #8	
POP		{R1-R7, PC}

KeypadBacklight_Time_Up_To_Save:
@До
	MOV		R0, #4							@Смещение == 4
	B		KeypadBacklight_Time_Save_Write
	
KeypadBacklight_Time_Save_12_Convert:
	LDR		R0, =AMPM
	LDRB	R0, [R0]
	CMP		R0, #0							@AM ?
	BEQ		KeypadBacklight_Time_Save_12_Convert_AM
	
	CMP		R5, #12							@12 часов ?
	BEQ		KeypadBacklight_Time_Save_Start
	
	ADD		R5, #12
	B		KeypadBacklight_Time_Save_Start
	
KeypadBacklight_Time_Save_12_Convert_AM:
	CMP		R5, #12
	BNE		KeypadBacklight_Time_Save_Start
	
	MOV		R5, #0
	B		KeypadBacklight_Time_Save_Start	
.data

Get_Selected_Num:
PUSH 	{LR}
	LDR		R0, =DspList
	LDRH	R0, [R0, #32]
POP		{PC}
.data

@Функция добавления пункта меню
@{Str, num_item}
My_Add_Func:			
PUSH 	{R2, LR}
	SUB 	SP, SP, #4
	ADD 	R3, R0, #0
	MOV		R0, #0
	STR		R0, [SP]
	MOV		R2, #2
	ADD 	R0, R4, #0
	BL		AddList							@AddList(Main){DspList struct, Num_of_item(from_0), Type(st 0x2), Lan_Res_Addr., [sp]=0}
	ADD 	SP, SP, #4		
POP	 {R2, PC}

@Функция добавления подсказки для пункта меню
@{Hint_Str, num_item}	
My_Add_Hint_Func:
PUSH 	{R2, LR}
	SUB 	SP, SP, #4	
	ADD 	R3, R0, #0
	MOV		R0, #0
	STR		R0, [SP]
	MOV		R2, #3
	ADD 	R0, R4, #0
	BL		AddList							@AddList(Hints){DspList struct, Num_of_item(from_0), Type(0x3), Hint_Lan_Res_Addr., [sp]=0}
	ADD 	SP, SP, #4		
POP 	{R2, PC}

@Функция обработки подсказки (меню стандартного типа)
GetDefaultMenuValue_4_2_3_Sub:
PUSH {LR}
	CMP 	R1, #1							@Первый пункт ?
	BEQ 	Display_BackLight_Value
	
	CMP 	R1, #2							@Второй пункт ?
	BEQ 	KeyPad_BackLight_Value
	
Display_BackLight_Value:
	LDR		R0, =0x00000F06
	BL		hfd2_30ReadBlockNameInRamImage
	LDR 	R0, [R0]
	LDR		R3, =0x0000043D
	LSL		R0, R0, #8
	LSR		R0, R0, #29
	ADD		R0, R0, R3
	BL		lk_get_text
	B		GetDefaultMenuValue_4_2_3_Sub_Format_Exit	

KeyPad_BackLight_Value:
	ADR		R0, ="By NeO_2kX"

GetDefaultMenuValue_4_2_3_Sub_Format_Exit:	
	MOV		R2, R0
	MOV		R0, R7
	ADR		R1, ="%s"
	BL		_sprintf

POP {PC}
.data

@Функция чтения текущего режима
@mode = int Get_Cur_Backlight_Mode(void);
Get_Cur_Backlight_Mode:
PUSH 	{R1, LR}
	MOV		R1, #0
	MOV		R0, #0
	BL		Read_EEPROM
POP 	{R1, PC}

@Функция сохранения текущего режима
@void Save_Cur_Backlight_Mode(int mode);
Save_Cur_Backlight_Mode:
PUSH	{R0-R1, LR}
	MOV		R2, R0
	MOV		R1, #0
	MOV		R0, #0
	BL		Write_EEPROM
POP		{R0-R1, PC}
.data

@Получение строки сохраненного времени
@*TimeBuf Get_Save_Time_String(time_id, type)
@id == 0, if after
@id == 1, if up to
Get_Save_Time_String:
PUSH 	{R1, LR}
	CMP		R0, #1
	BEQ		Get_Save_Time_Up_To_String

@После	
	MOV		R0, #0
	
Get_Save_Time_String_Start:	
	BL		Get_Save_Time					@*Org_SysTime Get_Save_Time(time_id)

Get_Save_Time_String_Start_2:
	BL		Make_Time_String				@*TimeBuf Make_Time_String(*Org_SysTime, string_type)
POP		{R1, PC}

Get_Save_Time_Up_To_String:
@До
	MOV 	R0, #1
	B		Get_Save_Time_String_Start
.data

@Получение сохраненного времени
@*Org_SysTime Get_Save_Time(time_id)
@id == 0, if after
@id == 1, if up to
Get_Save_Time:
PUSH	{R1, LR}
SUB		SP, SP, #4
	CMP		R0, #1
	BEQ		Get_Save_Time_Up_To

@После	
	MOV		R0, #2
	
Get_Save_Time_Start:
	MOV		R1, #1
	BL		Read_EEPROM
	
	STR		R0, [SP]	
	ADD		R0, SP, #0
	
	LDRB	R1, [R0, #2]					@Min
	LDRB 	R0, [R0, #3]					@Hour	
	BL		Make_Time_Format				@*Org_SysTime Make_Time_Format_Str(hour,min)
	
ADD		SP, SP, #4
POP		{R1, PC}

Get_Save_Time_Up_To:
@До
	MOV		R0, #4
	B 		Get_Save_Time_Start
.data

@Функция создания структуры времени 24-х часового формата
@*Org_SysTime Make_Time_Format_Str(hour,min)
Make_Time_Format:
PUSH 	{R2, LR}
	LDR		R2, =Org_SysTime
	STRB	R0, [R2, #2]					@Hour
	STRB	R1, [R2, #1]					@Min
	
	MOV		R0, #0							@
	STRB	R0, [R2, #3]					@TimeFormat == 24
	STRB	R0, [R2, #4]					@
	STRB	R0, [R2]						@Sec == 0
	MOV		R0, R2	
POP		{R2, PC}
.data

@*TimeBuf Make_Time_String(*Org_SysTime, string_type)
Make_Time_String:
PUSH {R1-R6, LR}
	MOV		R6, R1
	MOV		R5, R0
	LDR		R4, =TimeBuf	
	BL		GetCurTimeFormat
	CMP 	R0, #0
	BEQ		Make_Time_String_Start

	MOV		R0, R5
	MOV		R1, #1
	BL		lk_ChangeTimeFormat
	
Make_Time_String_Start:
	MOV		R0, R4		
	MOV		R1, R0
	MOV		R2, #0
	MOV		R3, #0
	STMIA	R1!, {R2, R3}
	
	CMP		R6, #1
	BEQ		Make_Time_String_AM_PM
	
Make_Time_String_Start_2:	
	MOV		R1, R5
	BL		lk_GetTimeString
	
	MOV		R0, R4
POP {R1-R6, PC}

Make_Time_String_AM_PM:
	MOV		R2, #2
	B		Make_Time_String_Start_2
.data

GetCurTimeFormat:
@TimeFormat = int GetCurTimeFormat(void)
@TimeFormat:
@0 - 24
@1 - 12
PUSH 	{LR}
	LDR 	R0, =TimeFormat
	LDRB 	R0, [R0]
POP 	{PC}
.data

.string "</my0_5task_0064>"
.string "<my0_5if_0064>"
.align 1
my0_5if_0064:
PUSH 	{R1, LR}
	BL		Get_Cur_Backlight_Mode
	
	CMP		R0, #1
	BEQ		my0_5if_0064_exit_0
	
	MOV 	R0, #1
	B		my0_5if_0064_exit
	
my0_5if_0064_exit_0:
	MOV		R0, #0
	
my0_5if_0064_exit:
POP 	{R1, PC}
.string "</my0_5if_0064>"


@Обработчик текстовых индексов
.align 1
my_0_5get_text_0064:
	ADD 	R2, R1, #0
	LDR		R3, =0x2640						@R3 = начальный индекс
	CMP		R0, R3
	BLT		Get_Text_Fast_Menu_3_Exit_Error
	SUB 	R1, R0, R3
	LSL 	R1, R1, #2
	
	CMP 	R2, #3							@Текущий язык == текущий ?
	BNE 	English_Lan
	
	ADR 	R0, =string_table_rus

restore_my_0_5get_text_0064:
	LDR 	R0, [R0, R1]
	BX		LR

English_Lan:
	ADR 	R0, =string_table_eng
	B		restore_my_0_5get_text_0064

Get_Text_Fast_Menu_3_Exit_Error:
	ADR		R0, ="KeyPad_Backlight_error"
	BX		LR
.data


@Таблица языковых ресурсов патча (Огромное спасибо AlexeyK)
.align 2
string_table_rus:
.word Display_BackLight KeyPad_BackLight Mode_Rus Night_Rus Manual_Rus Always_Rus Disable_Rus After_Rus Up_To_Rus Only_Manual_Mode_Rus

Display_BackLight:
.string "Подсветка дисплея"

KeyPad_BackLight:
.string "Подсветка клавиатуры"

Mode_Rus:
.string "Режим"

Night_Rus:
.string "Исп. в ночное время"

Manual_Rus:
.string "Исп. в определенное время"

Always_Rus:
.string "Исп. в любое время"

Disable_Rus:
.string "Не использовать"

After_Rus:
.string "После"

Up_To_Rus:
.string "До"

Only_Manual_Mode_Rus:
.string "Только в режиме опред. времени"

string_table_eng:
.word Display_BackLight_Eng KeyPad_BackLight_Eng Mode_Eng Night_Eng Manual_Eng Always_Eng Disable_Eng After_Eng Up_To_Eng Only_Manual_Mode_Eng

Display_BackLight_Eng:
.string "Display backlight"

KeyPad_BackLight_Eng:
.string "Keypad backlight"

Mode_Eng:
.string "Mode"

Night_Eng:
.string "Use at nighttime"
 
Manual_Eng:
.string "Use at custom time" 

Always_Eng:
.string "Use at anytime" 

Disable_Eng:
.string "Not use"
 
After_Eng:
.string "After" 

Up_To_Eng:
.string "Up to"

Only_Manual_Mode_Eng:
.string "Only in a mode of custom time"

@MCC скрипты патча
.string "<Mcc scripts>"
.align 2
mcc_backlight_menu:
.mcc MCC_INIT_RESTORE
.mcc MCC_TITLE 		0xA 0x424 	0x4
@244
.mcc MCC_MENU 		0xA 0x2640 	0x2 	0x43
.mcc MCC_NAVIGSA 	0xA 0 		0 		0x424 mcc_set_backlight_new		 	0x2640
.mcc MCC_NAVIGEA 	0xA 0 		0 		0x424 My_KeyPad_Backlight_menu		0x2641
.mcc MCC_ELSEIF 	0x9 0x1 	0x9 		0 mcc_set_end
.mcc MCC_RETMENU 	0x1

mcc_set_backlight_new:
.mcc MCC_INIT_RESTORE
.mcc MCC_TRANSF 0 0 0 0 mcc_set_backlight+16

@Меню 'Подсветка Клавиатуры'
My_KeyPad_Backlight_menu:
.mcc MCC_SET_CURLIST

My_KeyPad_Backlight_menu_sub:
.mcc MCC_INIT_RESTORE
.mcc MCC_RELEASE_LIST
.mcc MCC_SET_LIST 0 0x0014 0x0080 0x005A
.mcc MCC_TASK 0x10 0x64
.mcc MCC_DISP_LIST

.mcc MCC_IF 0x9 0x1 0xE 	0 My_Backlight_menu_select			@Клавиша левая софт	
.mcc MCC_IF 0x9 0x1 0x8 	0 My_Backlight_menu_select	    	@Клавиша вызова
.mcc MCC_IF 0x9 0x1 0x12 	0 My_Backlight_menu_select 			@Клавиша I (требуется X-tend Navigator)

.mcc MCC_IF 0x9 0x2 0x1 	0 My_Backlight_menu_select			@Клавиша 1
.mcc MCC_IF 0x9 0x2 0x2 	0 My_Backlight_menu_select			@Клавиша 2
.mcc MCC_IF 0x9 0x2 0x3 	0 My_Backlight_menu_select			@Клавиша 3

.mcc MCC_IF 0x9 0x1 0x1 	0 My_KeyPad_Backlight_menu_ret		@Клавиша правый софт
.mcc MCC_IF 0x9 0x1 0xF 	0 My_KeyPad_Backlight_menu_ret		@Клавиша правый софт
.mcc MCC_IF 0x9 0x1 0x2 	0 My_KeyPad_Backlight_menu_ret		@Клавиша С
.mcc MCC_IF 0x9 0x1 0x9 	0 rel_xit							@Клавиша окончания вызова

@Обработка выбора пункта меню (DspList + #32)
My_Backlight_menu_select:
.mcc MCC_IF 0x12 0x15 0 0 My_KeyPad_Backlight_Mode_Menu			@Режим
.mcc MCC_IF 0x12 0x15 1 0 My_Keypad_After_Set_Time				@После
.mcc MCC_IF 0x12 0x15 2 0 My_Keypad_Up_To_Set_Time				@До


My_KeyPad_Backlight_menu_ret:
.mcc MCC_RELEASE_LIST
.mcc MCC_RETMENU 0x1

rel_xit:
.mcc MCC_RELEASE_LIST
.mcc MCC_EXIT

My_KeyPad_Backlight_Mode_Menu:
.mcc MCC_TASK 0x10 0x64 0x3

.mcc MCC_INIT_RESTORE
.mcc MCC_RELEASE_LIST
.mcc MCC_SET_LIST 0 0x0014 0x0080 0x005A
.mcc MCC_TASK 0x10 0x64 0x1
.mcc MCC_DISP_LIST

.mcc MCC_IF 0x9 0x1 0xE 	0 My_config_mode_select			@Клавиша левая софт	
.mcc MCC_IF 0x9 0x1 0x8 	0 My_config_mode_select	    	@Клавиша вызова
.mcc MCC_IF 0x9 0x1 0x12 	0 My_config_mode_select 		@Клавиша I (требуется X-tend Navigator)

.mcc MCC_IF 0x9 0x1 0x1 	0 My_config_mode_select_ret
.mcc MCC_IF 0x9 0x1 0xF 	0 My_config_mode_select_ret
.mcc MCC_IF 0x9 0x1 0x2 	0 My_config_mode_select_ret
.mcc MCC_IF 0x9 0x1 0x9 	0 rel_xit

My_config_mode_select:
.mcc MCC_TASK 0x10 0x64 0x2									@Сохранение выбранного режима
.mcc MCC_CALL 0 0 0 0 mcc_set_report_change_call			@Сообщение "Изменено"

My_config_mode_select_ret:
.mcc MCC_RELEASE_LIST
.mcc MCC_SET_CURLIST 0										@Установка 0-го пункта меню(от 0)
.mcc MCC_TRANSF 0 0 0 0 My_KeyPad_Backlight_menu_sub

@Установка времени для пункта меню 'После'
My_Keypad_After_Set_Time:
.mcc MCC_IF 0x10 0x64 0 0 My_Keypad_After_Set_Time_Message_ret
.mcc MCC_INIT_RESTORE
.mcc MCC_RELEASE_LIST
.mcc MCC_EBUF 1
.mcc MCC_TASK 0x10 0x64 4									@Заполнение буфера редактирования
.mcc MCC_TASK 0x12 0x3E 6									@Заголовок "После"
.mcc MCC_EDIT 0x12 0x13 0x30F 0x2647						@Поле для ввода							
.mcc MCC_IF 0x9 0x1 0xF 	0 My_Keypad_After_Set_Time_ret	@Клавиша правый софт
.mcc MCC_IF 0x9 0x1 0x1 	0 My_Keypad_After_Set_Time_ret	@Клавиша удержание С
.mcc MCC_ELSEIF 0x9 0x1 0x9 0 rel_xit						@Клавиша окончания вызова

.mcc MCC_IF 0x12 0x18 0x1 0x1 My_Keypad_After_Set_Time_12

.mcc MCC_TASK 0x10 0x64 5									@Сохранение введенных данных
.mcc MCC_CALL 0 0 0 0 mcc_set_report_change_call			@Сообщение "Изменено"

My_Keypad_After_Set_Time_ret:
.mcc MCC_RELEASE_LIST
My_Keypad_After_Set_Time_ret_sub:
.mcc MCC_SET_CURLIST 1										@Установка 1-го пункта меню(от 0)
.mcc MCC_TRANSF 0 0 0 0 My_KeyPad_Backlight_menu_sub

My_Keypad_After_Set_Time_Message_ret:
.mcc MCC_REPORT 0x1 0x2 0x16 0x2649							@Сообщение "Только в режиме опред. времени"
.mcc MCC_TRANSF 0 0 0 0 My_Keypad_After_Set_Time_ret_sub

My_Keypad_After_Set_Time_12:
.mcc MCC_SET_CURLIST 0
.mcc MCC_INIT_RESTORE
.mcc MCC_SKDISPLAY 0x12 0 0x40 0x43							@Софт-клавиши
.mcc MCC_DISP_TITLE 0x12 0x2647								@Заголовок "После"
.mcc MCC_SET_LIST 0 0x14 0x80 0x5A
.mcc MCC_CREATE_LIST 0x1 0x2								@Создание листа
.mcc MCC_ADD_LIST 0 0x2 0x12 0x371							@Пункт AM
.mcc MCC_ADD_LIST 0x1 0x2 0x12 0x372						@Пункт PM
.mcc MCC_DISP_LIST

.mcc MCC_IF 0x9 0x1 0xF 0 My_Keypad_After_Set_Time			@Клавиша правый софт
.mcc MCC_ELSEIF 0x9 0x1 0x2 0 My_Keypad_After_Set_Time		@Клавиша С
.mcc MCC_ELSEIF 0x9 0x1 0x1 0 My_Keypad_After_Set_Time		@Клавиша удержание С
.mcc MCC_ELSEIF 0x9 0x1 0x9 0 rel_xit						@Клавиша окончания вызова
.mcc MCC_TASK 0x12 0x56

.mcc MCC_RELEASE_LIST
.mcc MCC_RETURN	 

@Установка времени для пункта меню 'До'
My_Keypad_Up_To_Set_Time:
.mcc MCC_IF 0x10 0x64 0 0 My_Keypad_Up_To_Set_Time_Message_ret
.mcc MCC_INIT_RESTORE
.mcc MCC_RELEASE_LIST
.mcc MCC_EBUF 1
.mcc MCC_TASK 0x10 0x64 4 1									@Заполнение буфера редактирования
.mcc MCC_TASK 0x12 0x3E 7									@Заголовок "До"
.mcc MCC_EDIT 0x12 0x13 0x30F 0x2648						@Поле для ввода							
.mcc MCC_IF 0x9 0x1 0xF 	0 My_Keypad_Up_To_Set_Time_ret	@Клавиша правый софт
.mcc MCC_IF 0x9 0x1 0x1 	0 My_Keypad_Up_To_Set_Time_ret	@Клавиша удержание С
.mcc MCC_ELSEIF 0x9 0x1 0x9 0 rel_xit						@Клавиша окончания вызова

.mcc MCC_IF 0x12 0x18 0x1 0x1 My_Keypad_Up_To_Set_Time_12

.mcc MCC_TASK 0x10 0x64 5 1									@Сохранение введенных данных
.mcc MCC_CALL 0 0 0 0 mcc_set_report_change_call			@Сообщение "Изменено"

My_Keypad_Up_To_Set_Time_ret:
.mcc MCC_RELEASE_LIST
My_Keypad_Up_To_Set_Time_ret_sub:
.mcc MCC_SET_CURLIST 2										@Установка 2-го пункта меню(от 0)
.mcc MCC_TRANSF 0 0 0 0 My_KeyPad_Backlight_menu_sub

My_Keypad_Up_To_Set_Time_Message_ret:
.mcc MCC_REPORT 0x1 0x2 0x16 0x2649							@Сообщение "Только в режиме опред. времени"
.mcc MCC_TRANSF 0 0 0 0 My_Keypad_Up_To_Set_Time_ret_sub

My_Keypad_Up_To_Set_Time_12:
.mcc MCC_SET_CURLIST
.mcc MCC_INIT_RESTORE
.mcc MCC_SKDISPLAY 0x12 0 0x40 0x43							@Софт-клавиши
.mcc MCC_DISP_TITLE 0x12 0x2648								@Заголовок "До"
.mcc MCC_RELEASE_LIST
.mcc MCC_SET_LIST 0 0x14 0x80 0x5A
.mcc MCC_CREATE_LIST 0x1 0x2								@Создание листа
.mcc MCC_ADD_LIST 0 0x2 0x12 0x371							@Пункт AM
.mcc MCC_ADD_LIST 0x1 0x2 0x12 0x372						@Пункт PM
.mcc MCC_DISP_LIST

.mcc MCC_IF 0x9 0x1 0xF 0 My_Keypad_Up_To_Set_Time			@Клавиша правый софт
.mcc MCC_ELSEIF 0x9 0x1 0x2 0 My_Keypad_Up_To_Set_Time		@Клавиша С
.mcc MCC_ELSEIF 0x9 0x1 0x1 0 My_Keypad_Up_To_Set_Time		@Клавиша удержание С
.mcc MCC_ELSEIF 0x9 0x1 0x9 0 rel_xit						@Клавиша окончания вызова
.mcc MCC_TASK 0x12 0x56

.mcc MCC_RELEASE_LIST
.mcc MCC_RETURN	 

@Сообщение "Изменено"
mcc_set_report_change_call:
.mcc MCC_INIT_RESTORE
.mcc MCC_REPORT 0xE 0x2 0xA 0x4B3
.mcc MCC_RETURN

.string "</Mcc scripts>"
.string "</Keypad Backlight By NeO_2kX>"