/*замена старой версии Офклика, чтоб не конфликтовал с ГП0.5
Но основная цель - освоение практических навыков написания патчей
все идеи MaxKisa, но он утерял исходники :(.
За помощь в понимании работы патча спасибо автору и Neo_2kX

Cr_az2
*/


.binid X100XEDG1
.include "ExtendedApi.h"
.include "off_header.h"

/*
Алгоритм работы патча следующий.
1. Вклиниваемся в код обработки краткого нажатия "отбоя", делаем переход на свой адрес
2. По своему адресу делаем нужное меню
Что раскопал автор - обработчик короткого нажатия, вызывание функций(выключение тел.,
 режиме без звука, блокировка клавиатур) пользователем.
3. Что доделано - иконки в меню, зависимость иконки режима без звуки от самого режима :)
*/
; в иконочном меню не срабатывают цифровые кнопки без этого участка
; кода, большое спасибо vvyura за подсказку
.org 0x0B4D82
    BEQ   0x0B4D9A

; обработчики ЕкстАпи. Интерестно как раньше без них обходились?
.org __my0_5task_Table+0x80*4
	DCD		my0_5task_0080+1    ;обработчик для главного меню
	DCD		my0_5task_0081+1    ;обработчик для пунктов меню
	
.org ExtTextHandler_Table + 12*4
    DCD     Get_Text_Offcl+1
    DCD 	Get_Text_Offcl+1

.org ExtIconHandler_Table+6*4
   DCD     MyExtIconHandler+1
   
;вклиниваемся в код обработчиков клавиш в прошивке и делаем переход на свой участок кода   
.start Key_case					
	LDR R0, =Start_Patch+1		;адрес участка
	BX R0
	B After_case_trans
.data
	
@.start exit_offset
@b exit_adr


.orgbl ORG_BL	
.start Start_Patch
	mov R1, #0							;точно не могу сказать зачем тут именно ноль, но с ним стабильнее
	LDR R0, =My_main_menu               @My_Mcc
	BL lk2_12start_menu_edit_fsm
	MOV R0, #0x51
	BL generate_key_tone
	LDR R0, =gv_idle_inout
	STRB R7, [R0]             ;байт по адресу [R0] = R7
	LDR R0, =0x00084FB2		  ;адресс возврата
	MOV PC, R0
.data

;Обработчик текстовых индексов (только при наличии Extended Api)
.align 1

Get_Text_Offcl:
ADD R2, R1, #0
LDR	R3, =0x20C0
CMP	R0, R3
BLT	Get_Text_Offcl_Exit_Error
R1=R0-R3
   LSL R1, R1, #2
    CMP      R2, #1
    BEQ      English_Lan
   ADR R0, =string_table_rus
   
restore:
   LDR R0,[R0,R1]
BX	LR

English_Lan:
    ADR      R0, =string_table_eng
    B          restore


Get_Text_Offcl_Exit_Error:
	ADR		R0, ="Fast_Menu_error"
	BX		LR
.data

;добавление пунктов меню
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}
.data

;добавление иконок к пунктам
My_Add_Func_Icon:
push {r2, lr}
	SUB SP, SP, #4
	MOV R3, #0
	STR	R0, [SP]
	MOV	R2, #4
	ADD R0, R4, #0
	BL	AddList						@AddList(Icons){DspList struct, Num_of_item(from_0), Type(0x4), 0, [sp]=IconTimerId}
	ADD SP, SP, #4
pop {r2, pc}
.data

;Обработчик иконок (только при наличии Extended Api 2)
;При загрузке адреса иконки также используется табличный метод, который мне подсказал AlexeyK
;За что ему спасибо ;)
;А я этот код взял из исходников ФМ3, за что спасибо Neo_2kX
.string "<MyExtIconHandler>"
.align 1
MyExtIconHandler:
PUSH {R2, LR}
	/*MOV 	R3, #0x41			@0x1040
	LSL 	R3, R3, #6 			@*/
	LDR R3, =0x1060
	CMP		R0, R3
	BLT		MyExtIconHandler_Err
	SUB 	R2, R0, R3

	MOV		R0, #0
	LDR		R1, =Ix_pos
	STRH	R0, [R1]
	LDR		R1, =Iy_pos
	STRH	R0, [R1]

	MOV		R0, #16
	LDR		R1, =Iwidth
	STRH	R0, [R1]
	LDR		R1, =Iheight
	STRH	R0, [R1]

	MOV		R0, #2
	LSL		R0, #8
	LDR		R1, =Isize
	STRH	R0, [R1]

	MOV		R0, #3
	LDR		R1, =Ibit_size
	STRB	R0, [R1]

	MOV		R0, #6
	LDR		R1, =Iversion
	STRB	R0, [R1]

	MOV		R0, #0
	SUB		R0, #1
	LDR		R1, =Iduration
	STRH	R0, [R1]

	LDR		R1, =IGraphic

	LSl R2, R2, #2
	LDR R0, =Icon_Table
	LDR R0, [R0,R2]
	STR 	R0, [R1]

	MOV		R0, #0
POP {R2, PC}

MyExtIconHandler_Err:
	MOV		R0, R1
POP {R2, PC}
.data
.string "</MyExtIconHandler>"


@Таблица языковых ресурсов патча (Огромное спасибо AlexeyK)
.align 2
string_table_rus:
.word BLOCK_KEYB, SOUND_OFF_ON, SHUTDOW

BLOCK_KEYB:
.string "Заблок. клавиатуру"

SOUND_OFF_ON:
.string "Режим без звука"

SHUTDOW:
.string "Выкл. телефон"
.data

.align 2
string_table_eng:
.word BLOCK_KEYB_eng, SOUND_OFF_ON_eng, SHUTDOW_eng

BLOCK_KEYB_eng:
.string "Lock keypad"

SOUND_OFF_ON_eng:
.string "Mute"

SHUTDOW_eng:
.string "Shutdown phone"
.data


@Основное меню патча
.align 1
my0_5task_0080:
push {r0-r7,lr}
.equ Item_Num_Main_Menu_Fast 	#3
SUB SP, SP, #0xC


@Прорисовка заголовка
	MOV R2, #0
	MOV R1, #0
	ldr r0,=0x0207					@0x0207 - "Опции"
	BL	lk_get_text    				@{Lan_Res_ID}:Adress
	BL	Reg_Draw_Title				@{Title_Str_Adress, ?(0), ?(0)}

@Прорисовка софт-клавиш
	MOV	R0, #0x4F					@Выбрать
	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, #Item_Num_Main_Menu_Fast
	MOV	R1, #2
	ADD R0, R4, #0
	BL	CreateList 					@{DspList struct, Type, Num_of_items, 0}
	
;первый пункт меню
	LDR R0, =0x20C0					
	BL	lk_get_text
	MOV R1, #0
	bl My_Add_Func						@{Str, num_item}
@Вывод иконки первого пункта				
	LDR R0, =0x1060		
	MOV R1, #0
	BL My_Add_Func_Icon
	
;второй пункт меню
	LDR R0, =0x20C1					
	BL	lk_get_text
	MOV R1, #1
	bl My_Add_Func						@{Str, num_item}
@Вывод иконки второго пункта	
	Ldr r0,=mmi_quiet_mode_onoff   
	LDRB R0, [R0]   
    CMP R0, #0
    cmp r0,1			; неактивен?
bne _passive
_active:
	LDR R0, =0x1062	
bl _OutIco

_passive:
	LDR R0, =0x1061
	
_OutIco:			
	MOV R1, #1
	BL My_Add_Func_Icon	

;третий пункт меню
	LDR R0, =0x20C2					
	BL	lk_get_text
	MOV R1, #2
	bl My_Add_Func						@{Str, num_item}
@Вывод иконки третьего пункта				
	LDR R0, =0x1063			
	MOV R1, #2
	BL My_Add_Func_Icon

ADD SP, SP, #0xC
pop {r0-r7,pc}
.data

@обработчик для трех пунктов меню. Номер пункта передаётся в пар2 мсс 
.string "<My_main_submenu_tasker>"
.align 1
my0_5task_0081:
push {r0-r7,LR}
SUB SP,SP,#8

LDRH R0, [R0, #4]
.case R0 _exitTask _blockPhone _mute _PowerOff

_exitTask:
ADD SP,SP,#8
pop {r0-r7,PC}

_blockPhone:
	MOV R0,1				; тот бит, который в системном буфере будет блокировать клаву
    LDR R1, =sys_buffer	    ; адресс буфера в р1
    LDR r2,r1,4			    ; в р2 из буфера со смщением в 4ре байта
    ORR r0, r2				; логически умножаем
    str r0, r1,4			; записываем единицу в буфер
b _exitTask

_mute:
LDR R0, =mcc_set_quiet_mode_onoff
MOV R1, #0
BL lk2_12start_menu_edit_fsm
b _exitTask

_PowerOff:
MOV R0, #0x1 ;
bl hen3_10SendSPPSwitchOffInd 
b _exitTask

.data
.string "</My_main_submenu_tasker>"
@Таблица иконок патча
.string "<Icon_Table>"
.align 2
Icon_Table:
.word block mute_off mute_on power_off
.string "</offclick_Icon_Table>"

@Блок картинок
.string "<Image Block>"
block:
.image "Icons_Menu\\Lock.bmp", 16, 16, 16, "Блок"
mute_off:
.image "Icons_Menu\\sound_on.bmp", 16, 16, 16, "Звук вкл."
mute_on:
.image "Icons_Menu\\sound_off.bmp", 16, 16, 16, "Звук выкл."
power_off:
.image "Icons_Menu\\PowOff.bmp", 16, 16, 16, "Выключить"
.string "</Image Block>"

.string "<MCC>"
.align 4
My_main_menu:
	.mcc MCC_SET_CURLIST
My_main_menu_sub:
	.mcc MCC_INIT_RESTORE
	.mcc MCC_RELEASE_LIST
	.mcc MCC_SET_LIST 0 0x0014 0x0080 0x005A
	.mcc MCC_TASK 0x10 0x80
	.mcc MCC_DISP_LIST
@обработка нажатия некоторых клавишь
	.mcc MCC_IF 0x9 0x1 0xE 0 	_start_main_menu_func		@Клавиша левая софт
	.mcc MCC_IF 0x9 0x1 0x8 0 _start_main_menu_func		@Клавиша вызова
	.mcc MCC_IF 0x9 0x1 0x12 0 _start_main_menu_func 	@Клавиша I (требуется X-tend Navigator)

;обработка цифровых клавишь для перехода по пунктам	
	.mcc 0x1E 0x09 0x0002 0x0001 0 Block_phone          @клавиша 1
	.mcc 0x1E 0x09 0x0002 0x0002 0 mite_on_off		    @клавиша 2
	.mcc 0x1E 0x09 0x0002 0x0003 0 powerOff_mob		    @клавиша 3
exit_My_main_menu_sub:	
	.mcc MCC_RELEASE_LIST
	.mcc 0x4F
	
@ проверка активного пункта меню
_start_main_menu_func:
	.mcc MCC_IF 0x12 0x15 0   0 Block_phone		@Блокировка клавиатуры
	.mcc MCC_IF 0x12 0x15 0x1 0 mite_on_off		@Выкл/Вкл звук
	.mcc MCC_IF 0x12 0x15 0x2 0 powerOff_mob	@Выключить телефон

Block_phone:
.align 2
	.mcc mcc_task 0x10 0x81 0
	.mcc MCC_TRANSF     0 0 0 0 exit_My_main_menu_sub

mite_on_off:
	.mcc mcc_task 0x10 0x81 1
	.mcc MCC_TRANSF     0 0 0 0 exit_My_main_menu_sub
	
powerOff_mob:
	.mcc mcc_task 0x10 0x81 2
	.mcc MCC_TRANSF     0 0 0 0 exit_My_main_menu_sub


.string "</MCC>"

ORG_BL:	


	