@GP 0.5 Fix v2 By NeO_2kX

.equ DrawSprite 				0x004405C0 @r0-FromAdr, r1-Xpos, r2-Ypos, r3-Lenght, r4-Height
.equ DrawTransparamentSprite 	0x004405F0 @r0-FromAdr, r1-Xpos, r2-Ypos, r3-Lenght, r4-Height
.equ GetFileTfs 				0x00440694 @R5- NewSpriteAdress R0- FileNamePointer , Return- R0=0 (True) R0!=0 (False)
.equ FillBox					0x0044059A @r0-Color, r1-Xpos, r2-Ypos, r3-Lenght, r4-Height
.equ ReadFile					0x003F9700
.equ myDrawMainMenuTitle 		0x003FB960
.equ GetStringByIndex 			0x003FB9F0
.equ DrawFile					0x003FB944
.equ lk_SetMenuType				0x000B9124
.equ ShowDebugInfo				0x003F904C @void ShowDebugInfo(void) 

@FFS
.equ ffsOpenDir					0x002C1298			@
.equ ffsReadDir					0x002C1370			 @ Dir
.equ ffsCloseDir				0x002C14A4			 @ Func
.equ ffsGetNumOfFiles 			0x002C3604			@
.equ ffsGetFileSize				0x002C1044

.equ ffsOpenFile				0x002C0374	; (int* handle, char* filename, mode):(int)
.equ ffsReadFile				0x002C0684	; (int handle, void* buf, bytestoread, bytesread*):(int)
.equ ffsCloseFile				0x002C060C	; (int handle)
.equ ffsCreateFile				0x002C0418	; (int* handle, char* filename, mode(8)):(int)
.equ ffsWriteFile				0x002C0820	; (uint fid, void *buffer, ulong bcount):(int)
.equ ffsSeekFile                0x002C3498	; (uint handle, ulong pos, long offset, ulong *new_ptr)
.equ ffsRemoveFile 				0x002C0E34 	; int ffsRemoveFile(char* filename)

@Mem
.equ memset						0x003E13E0
.equ memcpy						0x003E1444	@*dest memcpy(void *dest, const void *src, size_t n)
.equ MemMgr_Allocate			0x00395FEA
.equ MemMgr_Deallocate			0x003960B2	@void memset(void *s, int c, size_t n)
.equ RtkGetMemory				0x002C9760
.equ RtkReleaseMemory			0x002C9768
.equ memcmp						0x003E214C

@fmOpen Types
.equ fmOpenRead 				#2
.equ fmOpenWrite				#4

@Var
.equ LcdPattern					0x017A2BD4
.equ TempBuffer1				0x01656fd8	;0x8800
.equ TempBuffer2				0x0165f7d8
.equ MenuId 					0x016A2380
.equ Select 					0x017842B6	;содержит выбранный пункт в и-меню

@Исправление зависания и-меню
.start 0x006D7728
.mcc MCC_TRANSF 0 0 0 0 0x006D7968

@Журнал звонков
.start 0x006D7DD8
.mcc MCC_MENU 0x17 0x27F 0 0x40 0 1

@Сообщения
.start 0x006D7C68
.mcc MCC_MENU 0x17 0x27F 0 0x40 0 0

@Услуги сети
.start 0x006D7D28
.mcc MCC_MENU 0x17 0x27F 0 0x40 0 5

@Управление
.start 0x006D7BE8
.mcc MCC_MENU 0x17 0x0E1 0 0x40 0 1

@Телефонная книга
.start 0x006D7E88
.mcc MCC_MENU 0x17 0x053 0 0x40 0 0

@Органайзер
.start 0x006D7F38
.mcc MCC_MENU 0x17 0x27F 0 0x40 0 4

@Настройка звука
.start 0x006D8018
.mcc MCC_MENU 0x17 0x27F 0 0x40 0 2

@WAP&Игры
.start 0x006D80D8
.mcc MCC_MENU 0x17 0x27F 0 0x40 0 6

@Настройка телефона
.start 0x006D7AE8
.mcc MCC_MENU 0x17 0x27F 0   0x40 0 3
	
@Исправление вывода прозрачности
.start 0x003FB950
	BL		DrawSprite

@Корректировка переходов на ReadFile
.start 0x000B4784
	BL		ReadFile
	
.start 0x003F99A6
	BL		ReadFile
		
.start 0x003FB946
	BL		ReadFile

@Корректировка переходов на ReadFilePart	
.start 0x0009374C
	BL		ReadFilePart
	
.start 0x00093790
	BL		ReadFilePart
	
.start 0x003F97AE
	BL		ReadFilePart
	
.start 0x003F97BE
	BL		ReadFilePart
	
.start 0x003F97CE
	BL		ReadFilePart
	
.start 0x003F9898
	BL		ReadFilePart
	
.start 0x003F994E
	BL		ReadFilePart
	
.start 0x003F99B4
	BL		ReadFilePart
	
.start 0x003F99C8
	BL		ReadFilePart
	
.start 0x003FA8D2
	BL		TEST
	NOP

@Исправление функции чтения файла	
.start ReadFile	
PUSH	{R2-R6,LR}
	SUB		SP, SP, #12
	MOV		R5, R0
	MOV		R1, SP
	BL		ffsGetFileSize
	
	CMP		R0, #0
	BNE		Exit_ReadFile

@Выделение памяти	
	LDR		R0, [SP]
	BL		MemMgr_Allocate
	
	CMP		R0, #0
	BEQ		Exit_ReadFile
	
	MOV		R4, R0

@Открытие файла	
	MOV		R2, #fmOpenRead
	MOV		R1, R5
	ADD		R0, SP, #4
	BL		ffsOpenFile
	
	CMP		R0, #0
	BNE		Exit_ReadFile

@Чтение файла в буфер	
	ADD		R3, SP, #8
	LDR		R2, [SP]
	MOV		R1, R4
	LDR		R0, [SP, #4]
	BL		ffsReadFile

@Закрытие файла	
	LDR		R0, [SP, #4]
	BL		ffsCloseFile
	
	MOV		R0, R4
	LDR		R1, [SP, #8]

Exit_ReadFile:
ADD		SP, SP, #12
POP		{R2-R6,PC}

.align 1
ReadFilePart:
push {r2-r7,lr}
sub 	sp,8
	mov 	r7,r2
	mov 	r6,r1
	mov 	r5,r0
	
	mov 	r1,sp
	bl 		ffsGetFileSize
	
	CMP		R0, #0
	BNE		exitReadPart
	
	cmp 	r7,0
	bne 	ReadBytes

	ldr 	r0,sp
	sub 	r7,r0,r6
ReadBytes:
	mov 	r0,r7
	bl 		MemMgr_Allocate
	
	cmp 	r0,0
	beq 	exitReadPart
	mov 	r4,r0
	mov 	r0,sp
	mov 	r1,r5
	mov 	r2,2
	bl 		ffsOpenFile
	
	cmp 	r0,0
	bne 	exitReadPart
	ldr 	r0,sp
	mov 	r1,1
	mov 	r2,r6
	add 	r3,sp,4
	bl 		ffsSeekFile
	
	ldr 	r0,sp
	mov 	r1,r4
	mov 	r2,r7
	add 	r3,sp,4
	bl 		ffsReadFile
	
	ldr 	r0,sp
	bl 		ffsCloseFile
	
	mov 	r0,r4
	ldr 	r1,sp,4

exitReadPart:
add sp,8
pop {r2-r7,pc}

.setbyte 0x003F97A8

@Исправление функции прорисовки заголовка главного меню
.start myDrawMainMenuTitle
PUSH 	{R0-R5, LR}
SUB 	SP, SP, #20
	MOV 	R5, R0
	
	MOV 	R4, #8
	
	LDR 	R2, =LcdPattern
	LDRB 	R2, [R2]
	
	MOV 	R3, #10
	MUL 	R3, R5
	ADD 	R3, R2, R3
	ADD 	R3, #1

@Формирование строки	
	ADR 	R1, =0x3FBB04		;"/images/menu"
	MOV 	R0, SP				;*buf
	BL 		GetStringByIndex

@Чтение файла в буфер	
	LDR		R5, =TempBuffer2
	BL		GetFileTfs 			@R5- NewSpriteAdress R0- FileNamePointer , Return- R0=0 (True) R0!=0 (False)
	
	CMP		R0, #0
	BNE		MDMMT_FillBg

@Прорисовка заголовка главного меню
	MOV		R4, #64
	MOV		R3, #128
	MOV		R2, #0
	MOV		R1, #0
	MOV		R0, R5
	BL		DrawSprite 			@r0-FromAdr, r1-Xpos, r2-Ypos, r3-Lenght, r4-Height
	
Exit_myDrawMainMenuTitle:
ADD 	SP, SP, #20
POP 	{R0-R5, PC}

MDMMT_FillBg:
@Закраска белым фоном
	MOV		R4, #64
	MOV		R3, #128
	MOV		R2, #0
	MOV		R1, #0

	MOV		R0, #255
	LSL		R0, R0, #8
	ADD		R0, #255			@R0 = 0xFFFF
	BL		FillBox				@r0-Color, r1-Xpos, r2-Ypos, r3-Lenght, r4-Height
	
	B		Exit_myDrawMainMenuTitle
.data

.align 1
TEST:
PUSH	{R0-R1, LR}
	LDR		R0, =Select
	LDRB	R0, [R0]
	
	CMP		R0, #1
	BEQ		T_DirDenu
	
	CMP		R0, #5
	BEQ		T_DirDenu
	
	MOV		R0, #1				@Main Menu

T_Continue:	
	BL 		lk_SetMenuType
	
POP		{R0-R1, PC}

T_DirDenu:
	MOV		R0, #2				@Dir Menu
	B		T_Continue
.data

.setbyte 0x003FB9F0