/*
Патч позволяет выбрать размер шрифта при чтении/написании смс(8/10/12 номер шрифта). Идея - спасибо Pahanych.
(с) Cr_az2

Дописан NeO_2kX(c) (08.09.07).

*/
.equ ptch_body 0x000F5D98;F5D68 ; пустое место перед каким-то шрифтом
.equ mcc_block 0x007027EC;0x007801B8 ;пятый кадр анимации регуляции звука для внешнего экрана

.binid X100XEDG1

.include "EEPROMApi.h"
.include "ExtendedAPI.h"
.include "off_header.h"


.org __my0_5task_Table+0x78*4
	DCD		my0_5task_0078+1    ;обработчик для главного меню
.org ExtTextHandler_Table + 0x12*4
    DCD     Get_Text_ER+1

/*
Ф-ция не сохраняла lr,врезка его затирала, получался висяк.
Спасибо Ne0_2kX за наводку
*/
.start 0x000D97D8    
PUSH     {R7, LR}

.start 0x000D9840   
POP       {R7, PC}
NOP   

/*подмена стандартных текст. ресурсов.
"Переместить" на мою строку "Размер шрифта"*/
/*.start 0xA9D400
DCD my_string */

.start 0x000D97F2    
   	bl 		body

@Подсказки в стандартном меню   
.start 0x000AC286
	BNE		Go_Menu1_5_3_Sub
   
.start 0x000AC25A
	B		0x000AC27E

Go_Menu1_5_3_Sub:	
	LDR		R1, =Menu1_5_3_Sub+1
	BX		R1
.data
	
.setbyte 0x000AC27E
	
; врезка в код, в зависимости от  значения байта в ЕЕПРОМЕ (0/1/2)
; устанавливаем 8/10/12 шрифт
.org ptch_body
body:
push {r0-r1,lr}

	MOV		R1,  #0		;Читаем байт
	MOV		R0,  #1		; Смещение  1
	BL 		Long_Call_Read_EEPROM
	
	CMP		R0, #2
	BGT		body_Null

body_Continue:
	MOV		R7, R0

make_default:
pop  {r0-r1,pc}

body_Null:
	MOV		R0, #0
	B		body_Continue

/*
Длинный переход на чтение еепрома
*/
Long_Call_Read_EEPROM:
PUSH 	{R0, R1}
 	Ldr 	r0,=Read_EEPROM+1
 	STR 	R0, [SP, #4]
POP 	{R0, PC}


.start 0x007F2508
.mcc MCC_TRANSF 0 0 0 0 edit_menu

/*
блок мсс. Создание и работа с меню.
*/
.org mcc_block
Font_size_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 0x78 0
	.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 MCC_IF 0x9 0x1 0x9		exit_My_main_menu_sub
	
My_main_menu_Return:
	.mcc MCC_RELEASE_LIST
	.mcc MCC_RETMENU 1

exit_My_main_menu_sub:
	.mcc MCC_RELEASE_LIST
	.mcc MCC_EXIT

_start_main_menu_func:
	.mcc MCC_TASK 0x10 0x78 1
	.mcc MCC_CALL 0 0 0 0 mcc_set_report_change_call
	.mcc MCC_TRANSF 0 0 0 0 My_main_menu_Return

/*
Изменяем меню сообщения - настройки
*/
edit_menu:
	.mcc MCC_MENU 		0x8  0x2123 0x3 0x42
	.mcc MCC_NAVIGSA 	0x15 0 0 0x4F8 0x007F4178 0x4F3
	.mcc MCC_NAVIGA 	0x15 0 0 0x4F8 0x00413D60 0x4F4
	.mcc MCC_NAVIGEA 	0x15 0 0 0x4F8 Font_size_menu 0x4F4
	.mcc MCC_TRANSF 	0    0 0 0 0x007F2538

/*
=================================================
mcc_set_report_change_call
Выводит сообщение "Изменено"
=================================================
*/
mcc_set_report_change_call:
	.mcc MCC_INIT_RESTORE
	.mcc MCC_REPORT 0xE 0x2 0xA 0x4B3
	.mcc MCC_RETURN

.align 1
/*
=================================================
обработчик my0_5task_0078
=================================================
*/
my0_5task_0078:
push 	{r0-r7,lr}
SUB 	SP, SP, #12
	LDRH	R0, [R0, #4]

	CMP		R0, #0
	BEQ		_DrawMenu

	CMP		R0, #1
	BEQ		_SaveFontNum

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

.align 1
/*
=================================================
Прорисовка меню, 3 пункта.
=================================================
*/
_DrawMenu:
.equ DM_NumOfItems #3
@Прорисовка заголовка
	MOV 	R2, #0
	MOV 	R1, #0
	ldr 	r0, =0x0544					@0x0544 - "размер шрифта"
	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, #4]
	STR		R1, [SP, #8]
	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)}

@Cоздание списка
	LDR		R4, =DspList
	MOV		R3, #0
	MOV 	R2, #DM_NumOfItems
	MOV		R1, #RadioList
	ADD 	R0, R4, #0
	BL		CreateList 				@{DspList struct, Type, Num_of_items, 0}
	
@Добавление пунктов
	MOV		R7, #0					@MainCount = 0
	LDR		R6, =0x2120
	
DM_Loop:
	MOV		R0, R6	
	BL		lk_get_text	
		
	MOV		R2, R4
	MOV		R1, R7
	BL		Menu_AddItem			@void Menu_AddItem(char *Str, int num_item, *DspList)
	
	ADD		R7, #1					@MainCount++
	ADD		R6, #1					@TextCount++
	
	CMP		R7, #DM_NumOfItems
	BLT		DM_Loop
	
	MOV		R2, R4
	BL		Menu_AddItem			@void Menu_AddItem(char *Str, int num_item, *DspList)
		
	MOV		R1,  #0					;Читаем байт
	MOV		R0,  #1					;Смещение  1
	BL 		Read_EEPROM
	
	CMP		R0, #2
	BGT		DM_Continue

DM_Continue:	
	BL		SetCurList
									
b _exitTask

DM_Null:
	MOV		R0, #0
	B		DM_Continue
.data	
.align 1
/*
=================================================
_SaveFontNum
=================================================
*/
_SaveFontNum:
	BL		GetSelectedNum	@int GetSelectedNum(void) 
	MOV		R2, R0
	
	MOV		R1,  #0		;Пишем байт
	MOV		R0,  #1		;Смещение  1
	BL		Write_EEPROM
	
	b 		_exitTask
	
.align 1	
/*
=================================================
Menu1_5_3_Sub
=================================================
*/	
Menu1_5_3_Sub:
	CMP		R0, #3
	BNE		Exit_Menu1_5_3_Sub
	
   	MOV		R1,  #0		;Читаем байт
	MOV		R0,  #1		; Смещение  1
	BL		Read_EEPROM
	
	CMP		R0, #2
	BGT		Menu1_5_3_Sub_Null

Menu1_5_3_Sub_Continue:	
	LDR		R1, =0x2120
	ADD		R0, R0, R1
	
	BL		lk_get_text
	
	LDR		R1, =0x000AC3F4+1
	BX		R1
	
Exit_Menu1_5_3_Sub:
	LDR		R1, =0x000AC4DA+1
	BX		R1

Menu1_5_3_Sub_Null:
	MOV		R0, #0
	B		Menu1_5_3_Sub_Continue
.data


.align 1
/*
=================================================
Обработчик текстовых индексов (только при наличии Extended Api)
=================================================
*/
Get_Text_ER:
	MOV		R2, R1
	LDR		R3, =0x2120
	CMP		R0, R3
	BLT		Get_Text_ER_Exit_Error

	SUB		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_ER_Exit_Error:
	ADR		R0, ="ER_error"
	BX		LR
.data

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

.align 1
/*
=====================================================================
int GetSelectedNum(void) 
Фуннкция получения выбранного пункта меню
=====================================================================
*/
GetSelectedNum:
PUSH 	{LR}
	LDR		R0, =DspList
	LDRH	R0, [R0, #32]
POP		{PC}
.data

@Таблица языковых ресурсов патча (Огромное спасибо AlexeyK)
.align 2
string_table_rus:
.word f_8, f_10, f_12, sms, mms, font_size

f_8:
.string "Шрифт 8"

f_10:
.string "Шрифт 10"

f_12:
.string "Шрифт 12"

sms:
.string "SMS сообщения"
mms:
.string "MMS сообщения"
font_size:
.string "Размер шрифта"
.data

.align 2
string_table_eng:
.word f_8_eng, f_10_eng, f_12_eng, sms_eng, mms_eng, font_size_eng

f_8_eng:
.string "Font 8"

f_10_eng:
.string "Font 10"

f_12_eng:
.string "Font 12"

sms_eng:
.string "SMS messages"

mms_eng:
.string "MMS messages"

font_size_eng:
.string "Font size"
.data


  

  
