//   - ELFPACK 3.0

:::::::::::::::::::::::::::::::::::::::: FUNCTIONS ::::::::::::::::::::::::::::::::::::::::


     ////// //     //////  ////// ////// ////// //  //  //////    //////
    //     //     //      //  // //  // //     /////       //    //  //
   ////   //     ////    ////// //  // //     ///     //////    //  //
  //     //     //      //     ////// //     /////       //    //  //
 ////// ////// //      //     //  // ////// //  //  ////// // //////

   ///// //  //// // // /////
  // // //  //_/ //-// // //
 //-// /// //   // // //-//


::::::::::::::::::::::::::::::::::::: SWIHOOK CONTROL :::::::::::::::::::::::::::::::::::::

--------------------------
int SetSWIHookInRAMState()
--------------------------
 SWIHOOK (,    (swi-),     )
 ROM SWI-  RAM,   2 :   .    ROM ,
RAM -  , ..  -      -.
   swi.blib   \libs   - ,     
.
***********
:
0 - SWI HOOK     RAM
1 - SWI HOOK    RAM
***********
--------------------------------------------
int SetSWIFunc(void *addrfunc, short swinum)
--------------------------------------------
  -     swinum   -    addrfunc.
  swi-  -   -    ,
         -.
###########
:
void *addrfunc -  - ( -  )
short swinum   -   swi -
###########
***********
:
0 - SWI HOOK    RAM
1 - -  
***********
<EXAMPLE>

void DrawImgMod(unsigned int x, unsigned int y, unsigned int picture)
{
 /* some code */
}

int main()
{
 SetSWIHookInRAMState();
 SetSWIFunc((void *)&DrawImgMod, 35);
 // 35 -  swi: DrawImg(unsigned int x, unsigned int y, unsigned int picture)
 return 1;
}

</EXAMPLE>
-------------------------------
int RepairSWIFunc(short swinum)
-------------------------------
  swi -   RAM    swinum  
.  ,            
.
###########
:
short swinum   -   swi -
###########
***********
:
0 - SWI HOOK    RAM
1 - -  
***********
<EXAMPLE>


int main()
{
 SetSWIHookInRAMState();
 RepairSWIFunc(35);
 // 35 -  swi: DrawImg(unsigned int x, unsigned int y, unsigned int picture)
 return 1;
}

</EXAMPLE>
------------------
int RepairSWILib()
------------------
    swi -,     
***********
:
0 - SWI HOOK    RAM
1 -   
***********
<EXAMPLE>


int main()
{
 SetSWIHookInRAMState();
 RepairSWILib();
 return 1;
}

</EXAMPLE>
----------------------------------
int SetSWINumInCashe(short swinum)
----------------------------------
     swi-.      -.
###########
:
short swinum   -  swi -
###########
***********
:
0 - SWI HOOK    RAM
1 - SWI   
***********
----------------------------------
int RunSWIFromCashe(void *R0, ...)
----------------------------------
  SWI - (). -    SWI-,  
 -      ,      
     ,      .
   SWI  (HEX): 0x0XXX  0x8XXX .     
-   SWI .           SWIHOOK,
       .     -,
  .  
###########
:
     -    ,
     -    .
   ,     
void *R0   .
       : "(void *)arg0"
###########
***********
:
0xBB000000 - SWI HOOK    RAM
0xCC000000 -   
      -    
***********
<EXAMPLE_1>


int main()
{
 SetSWIHookInRAMState();
 SetSWINumInCashe(35);
 // 35 -  swi: DrawImg(unsigned int x, unsigned int y, unsigned int picture);
 RunSWIFromCashe((void *)10, 10, (int)"0:\\Zbin\\img.png");
 return 1;
}

</EXAMPLE_1>

<EXAMPLE_2>

int main(void)
{
  // SWI   RAM,   SwiHook  RAM
  // ,    -  
  SetSWIHookInRAMState();
  
  //  SWI - (RamScreenBuffer)   (     -)
  SetSWINumInCashe(0x80E0);
  //.. SWI   0x8XXX,   
  int addr = RunSWIFromCashe(0);
  
  
  //  SWI - (ShowMSG)   (     -)
  SetSWINumInCashe(0x0148);

  char msg[64];
  sprintf(msg, "RamScrBuf:\n0x%08X", addr);
  
  // SWI -     
  //(  ,      '0')
  //( 0x8XXX  )
  RunSWIFromCashe((void *)1, (int)msg);
  
  // :),    -  -,    ,
  //   
  SetSWINumInCashe(0x030D);// : 0x30D  RunSWIFromCashe
  RunSWIFromCashe(0);
  
  return 0;
}

</EXAMPLE_2>


::::::::::::::::::::::::::::::::::::: EDL SYSTEM :::::::::::::::::::::::::::::::::::::

-------------------------
int EDL_load(char *fname)
-------------------------
 edl - , ..    ,     ,
,        .
###########
:
fname -     ("0:/SomeThingELF/edls/gui.edl")
      -   ( )   "/libs" => "TestLib_v0001"
###########
***********
:
-100  -  
-101  -   / 
-102  -  
-103  - C EDL_HEADER  
-104  - EDL      
-105  -    
-106  -      -
-107  -   
-1 .. -13 -   'ELF'


-1  -   
-2  -   
-3  -       (  ID = 0x7F,'E','L','F')
-4  -    
-5  -    
-6  -    
-7  -      
-8  -    
-9  -    
-10 -    
-11 -    
-12 -   
-13 -      (  RAM)

+i  -  ! i -  - -

***********
-----------------------------------------
int EDL_unload(char *name, short version)
-----------------------------------------
   RAM    EDL
###########
:
char *name    -    
short version -    
###########
***********
:
 0 -   
-1 - EDL      
 1 -  
***********
---------------------------------------------------------
int EDL_use(char *name, short version, void *func_struct)
---------------------------------------------------------
       name,  version      
-,    ,  func_struct       ,
 : "(void *)&somelib",   -  .
     -    - .
###########
:
char *name        -    
short version     -    
void *func_struct -     - 
###########
***********
:
 0 -   
-1 - EDL   
 1 -  - 
***********
[!]   3 -    EDL .
[!]   uselib.c  testlib.h
--------------------------------
int EDL_addlib(void *edl_struct)
--------------------------------
 EDL_HEADER   - ( = EDL_STRUCT)   EDL
###########
:
void *edl_struct -   EDL_STRUCT
###########
***********
:
 0 -   
-1 - EDL      
 1 - 
--------------------------------
int EDL_remove(void *edl_struct)
--------------------------------
 EDL_HEADER   - ( = EDL_STRUCT)   EDL,  
   RAM 
###########
:
void *edl_struct -   EDL_STRUCT
###########
***********
:
 0 -   
-1 - EDL      
 1 -     (    RAM)
-----------------------
void *getEDL_baseAddr()
-----------------------
***********
:
     EDL,   ()
  EDL_HEADER  ,     0xD00DD00D.
***********
-----------------------
void *getEDL_curLibs()
-----------------------
***********
:
-  
***********
-----------------------
void *getEDL_maxLibs()
-----------------------
***********
:
 -  ,    bcfg
***********
------------------------------------------
int isEDL_exist(char *name, short version)
------------------------------------------
       name   version
###########
:
char *name    -   
short version -   
###########
***********
:
-1 -  !
-2 - EDL      
+i -    
***********
-------------------------------------------------------
int isEDL_support(char platform, char *phone, short sw)
-------------------------------------------------------
      ,    -
###########
:
char platform - 
char *phone   -   
short sw      -  
###########
***********
:
0 -   
1 -  
***********
----------------
int isSGoldX75()
----------------
***********
:
0 - SGold X65
1 - SGold X75
2 - NewSGold
3 - NewSGold E/EL71 (ELKA)
***********

---------==========::: ELF Dynamic Library :::==========---------


//Void Element  for EDL System
#define EDL_VOID 0xD00DD00D

//IDs for EDL file lib
#define EDL_ID1  0xDDDDEEEE
#define EDL_ID2  0x33212133
#define EDL_ID3  0xEEEEDDDD

//Small phone list
#define EDL_PHONE_NONE        "NONE"  //   (Not important)

#define EDL_PHONE_SGX65_C65   "C65"   // C65
#define EDL_PHONE_SGX65_SL65  "SL65"  // SL65
#define EDL_PHONE_SGX65_M65   "M65"   // M65
#define EDL_PHONE_SGX65_CX65  "CX65"  // CX65
#define EDL_PHONE_SGX65_CX70  "CX70"  // CX70
#define EDL_PHONE_SGX65_SK65  "SK65"  // SK65
#define EDL_PHONE_SGX65_S65   "S65"   // S65

#define EDL_PHONE_SGX75_C72   "C72"   // C72
#define EDL_PHONE_SGX75_CF75  "CF75"  // CF75
#define EDL_PHONE_SGX75_ME75  "ME75"  // ME75
#define EDL_PHONE_SGX75_C75   "C75"   // C75
#define EDL_PHONE_SGX75_M75   "M75"   // M75
#define EDL_PHONE_SGX75_CX75  "CX75"  // CX75

#define EDL_PHONE_NSG_S68     "S68"   // S68
#define EDL_PHONE_NSG_C81     "C81"   // C81
#define EDL_PHONE_NSG_M81     "M81"   // M81
#define EDL_PHONE_NSG_SL75    "SL75"  // SL75
#define EDL_PHONE_NSG_S75     "S75"   // S75

#define EDL_PHONE_ELKA_EL71   "EL71"  // EL71
#define EDL_PHONE_ELKA_E71    "E71"   // E71

//Platform list
#define EDL_PLATFORM_NONE     0x00    //   (Not important)
#define EDL_PLATFORM_SGX65    0x01    // SGold X65
#define EDL_PLATFORM_SGX75    0x02    // SGold X75
#define EDL_PLATFORM_NSG      0x04    // NewSGold
#define EDL_PLATFORM_ELKA     0x08    // NewSGold E/EL71 (ELKA)
//M  ,  : EDL_PLATFORM_NSG   + EDL_PLATFORM_ELKA
//                                   EDL_PLATFORM_SGX65 + EDL_PLATFORM_SGX75 + EDL_PLATFORM_NSG

//Firmware
#define EDL_FIRMWARE_NONE     0x00    //   (not important)


//EDL Struct - Lib Header
typedef struct {
  // IDs
  int   id1;                          // ID1
  int   id2;                          // ID2
  int   id3;                          // ID3
  // ,  (Name, version)
  char  name[32];                     //   (Library Name)
  char  authors[64];                  //  ((C)opy(R)ights)
  short version;                      //   (Library version)
  short count;                        // - -   (Count Functions in Library)
  // (Support)
  char  platform;                     //  (Phone Platform), EDL_PLATFORM_NONE -   (not important)
  char  phone[9];                     // M  (Phone Model), EDL_PHONE_NONE -   (not important)
  short sw;                           //  (FirmWare), EDL_FIRMWARE_NONE -   (not important)
  // - (Functions call addresses)
  void (*killproc)();                 //  -    RAM (Address function for kill current Library)
  void *func_first;                   //     -  
  /*                                  // Addresses first and next functions from current library
  void *func_second;
  void *func_third;
  ...
  void *func_last;
  */
}EDL_HEADER;