4.    
       :) 
    : .  . 
   "Project->Add Files"  Siemens.c  main.c 
(     Siemens.cpp    ). 
      Func.asm ( )  div.r79 (, .Swilib ) 
  main.c : 
onkey -   (return 1    ) 
onredraw -   ( screen[132*176]) 
onstart, oncreate -     
onclose, onexit -     
REDRAW()     ( onredraw) 
 !    .      ! 
 .  . 

5.  1.      
    main.c : 
#include "E:\ARM\swilib.h" 

void ElfKiller(void){ //      
extern void *ELF_BEGIN; 
//       mfree(), freeWS() 
((void (*)(void *))(mfree_adr()))(&ELF_BEGIN); //    :( 
} 

int main(char *exename, char *fname){ //   
//  exename      4:\Zbin\xyz.elf 
//  fname   ,    CardExplorere,  0:\Misc\data.txt 
//  0,  elf   
char *mem; 
int i, err; 
int handle; 
if(fname){ 
//    : 
handle=fopen(fname,A_ReadWrite+A_BIN+A_Append+A_Create,P_READ+P_WRITE,&err); 
//       .    (append),    
//  handle=fopen(fname,A_ReadOnly+A_BIN,P_READ,&err); //    -  . swilib.h 
if(handle!=-1){ //-1 = error 
mem=malloc(10000); //  : AllocWS()   ( 2) 
if(mem!=0){ //0 = error 
i=fread(handle,mem,10000,&err); //        err 
//  - makesomebody(mem,i); 
fwrite(handle,mem,i,&err); 
mfree(mem); //  : FreeWS()   
} 
fclose(handle); //   
} 
} 
SUBPROC((void *)ElfKiller); //     :)    ! 
return(0); 
} 
// PS. ..  x65        32767 , 
//  fread()  fwrite()    fread32()  fwrite32( ) 

int fread32(int fh, char *buf, int len, unsigned int *err) // () Rst7 
{ 
int clen; 
int rlen; 
int total=0; 
while(len) 
{ 
if (len>16384) clen=16384; else clen=len; 
total+=(rlen=fread(fh, buf, clen, err)); 
if (rlen!=clen) break; 
buf+=rlen; 
len-=clen; 
} 
return(total); 
} 

        Func.asm: 
PUBLIC ELF_BEGIN 
RSEG ELFBEGIN:DATA 
ELF_BEGIN 
defadr MACRO a,b 
PUBLIC a 
a EQU b 
ENDM 
END 

6.  2.       
    ,    , 
      .    TED- (c) Rst7 
 - :) 
   main.c : 
#include "E:\ARM\swilib.h" 

typedef struct 
{ 
GUI gui; 
// WSHDR *ws1; 
// WSHDR *ws2; 
// int i1; 
}MAIN_GUI; 

typedef struct 
{ 
CSM_RAM csm; 
int gui_id; 
}MAIN_CSM; 

const int minus11=-11; 
const unsigned int INK=0; 
const unsigned int PAPER=1; 
volatile int xx=0, yy=0; //    

const char bmp[12]={0xFC,0x86,0xB3,0xA9,0xB1,0xA9,0x81,0xFF,0,0,0,0}; 
const IMGHDR img = {8,12,0x1,0,(char *)bmp}; 

//================================ 
//   
//================================ 

void DrwImg(IMGHDR *img, int x, int y, int *pen, int *brush) 
{ 
RECT rc; 
DRWOBJ drwobj; 
StoreXYWHtoRECT(&rc,x,y,img->w,img->h); 
SetPropTo_Obj5(&drwobj,&rc,0,img); 
SetColor(&drwobj,pen,brush); 
DrawObject(&drwobj); 
} 

void DrawScreen(void) 
{ 
int *ink=GetPaletteAdrByColorIndex(INK); 
int *paper=GetPaletteAdrByColorIndex(PAPER); 
int x=xx; 
DrwImg((IMGHDR *)&img,x,yy,ink,paper); 
} 

//   
void method0(MAIN_GUI *data){ 
DrawScreen(); 
} 

void method1(MAIN_GUI *data, void *(*malloc_adr)(int)){} 
void method2(MAIN_GUI *data, void (*mfree_adr)(void *)){} 
void method3(MAIN_GUI *data, void *(*malloc_adr)(int), void (*mfree_adr)(void *)){} 
void method4(MAIN_GUI *data, void (*mfree_adr)(void *)){} 
void method7(MAIN_GUI *data, void (*mfree_adr)(void *)){} 
int method8(void){return(0);} //  - 
int method9(void){return(0);} //  - 

//------------------------------------------------------------------------------ 
// .  -   
//------------------------------------------------------------------------------ 
int method5(MAIN_GUI *data, GUI_MSG *msg) 
{ 
// if (msg->gbsmsg->msg==KEY_UP) //   
if ((msg->gbsmsg->msg==KEY_DOWN)||(msg->gbsmsg->msg==LONG_PRESS)) // .    
switch(msg->gbsmsg->submess) 
{ 
case RED_BUTTON: 
return(1); //  GeneralFunc  . GUI ->  GUI 
case UP_BUTTON: 
if(yy>0) --yy; break; 
case LEFT_BUTTON: 
if(xx>0) --xx; break; 
case DOWN_BUTTON: 
if(yy<130) ++yy; break; 
case RIGHT_BUTTON: 
if(xx<120) ++xx; break; 

// case GREEN_BUTTON: 
// case RIGHT_SOFT: 
// case ENTER_BUTTON: 
// case LEFT_SOFT: 
// case VOL_UP_BUTTON: 
// case VOL_DOWN_BUTTON: 
// case '0': 
// case '9': 
// case '#': 
// SUBPROC((void *)DoDiskAccess,1); 
// .          
} 
DrawScreen(); 
return(0); 
} 

const void * const gui_methods[11]={ 
(void *)method0, //Redraw 
(void *)method1, //Create 
(void *)method2, //Close 
(void *)method3, //Focus 
(void *)method4, //Unfocus 
(void *)method5, //OnKey 
0, 
(void *)method7, //Destroy 
(void *)method8, 
(void *)method9, 
0 
}; 

const RECT Canvas={0,0,131,175}; 

void maincsm_oncreate(CSM_RAM *data) 
{ 
MAIN_GUI *main_gui=malloc(sizeof(MAIN_GUI)); 
MAIN_CSM*csm=(MAIN_CSM*)data; 
zeromem(main_gui,sizeof(MAIN_GUI)); 

// ustk=malloc(STKSZ); //       
// info_ws=AllocWS(512); 

main_gui->gui.canvas=(void *)(&Canvas); 
main_gui->gui.flag30=2; 
main_gui->gui.methods=(void *)gui_methods; //   (. ) 
main_gui->gui.item_ll.data_mfree=(void (*)(void *))mfree_adr(); //     :( 
csm->csm.state=0; 
csm->csm.unk1=0; 
csm->gui_id=CreateGUI(main_gui); //   GUI 
} 

void Killer(void) //  
{ 
extern void *ELF_BEGIN; 
// mfree(ustk); //   
// FreeWS(info_ws); 
((void (*)(void *))(mfree_adr()))(&ELF_BEGIN); 
} 

void maincsm_onclose(CSM_RAM *csm) 
{ 
// GBS_StopTimer(&light_tmr); 
SUBPROC((void *)Killer); 
} 

int maincsm_onmessage(CSM_RAM *data, GBS_MSG *msg){ 
return(1); 
} 

unsigned short maincsm_name_body[140]; 

const struct 
{ 
CSM_DESC maincsm; 
WSHDR maincsm_name; 
}MAINCSM = 
{ 
{ 
maincsm_onmessage, //   
maincsm_oncreate, //    
// 0, //  S75    4  
// 0, //    swilib.h  #define NEWSGOLD 
// 0, 
// 0, 
maincsm_onclose, //    
sizeof(MAIN_CSM), 
1, 
&minus11 
}, 
{ 
maincsm_name_body, 
NAMECSM_MAGIC1, 
NAMECSM_MAGIC2, 
0x0, 
139 
} 
}; 

int main(char *exename, char *fname) 
{ 
char dummy[sizeof(MAIN_CSM)]; 
// strcpy(filename,fname); //  - fname 
CreateCSM(&MAINCSM.maincsm,dummy,0); 
return 0; 
} 

7.  .   ,    
   "Project->Add Files"  Siemens.c: 
// Siemens.c 0.1 
//    IAR 
//    ! (  ) 
//    : 
extern int onstart(char *exename, char *fname); //  .  0  1  . 
extern void oncreate(); //   
extern void onclose(); //   
extern void onexit(); //  
extern void onredraw(void); //   
extern int onkey(unsigned char keycode, int pressed); //  .  0  1  . 

//  swilib.h  //  #define NEWSGOLD   S75 
#include "E:\ARM\swilib.h" 
//    16   (RGB 565  2     screen) 
//   8   (RGB 232  1   ) 
#define HIGHCOLOR 
#ifdef HIGHCOLOR 
short screen[132*176]; 
const int screensize=132*176*sizeof(short); 
const IMGHDR img = {(unsigned)132,(unsigned)176,8,0,(char*)screen}; 
#else 
char screen[132*176]; 
const int screensize=132*176*sizeof(char); 
const IMGHDR img = {(unsigned)132,(unsigned)176,5,0,(char*)screen}; 
#endif 

//     ! :) 
typedef struct 
{ 
GUI gui; 
WSHDR *ws1; 
WSHDR *ws2; 
int i1; 
}MAIN_GUI; 

typedef struct 
{ 
CSM_RAM csm; 
int gui_id; 
}MAIN_CSM; 

void DrawScreen(){ 
RECT rc; DRWOBJ drwobj; 
StoreXYWHtoRECT(&rc,0,0,img.w,img.h); 
SetPropTo_Obj5(&drwobj,&rc,0,(IMGHDR*)&img); 
SetColor(&drwobj,GetPaletteAdrByColorIndex(0),GetPaletteAdrByColorIndex(1)); 
DrawObject(&drwobj); 
} 
void method0(MAIN_GUI *data){ onredraw(); DrawScreen();} 
void method1(MAIN_GUI *data, void *(*malloc_adr)(int)){ oncreate(); data->gui.state=1;} 
void method2(MAIN_GUI *data, void (*mfree_adr)(void *)){ data->gui.state=0;} 
void method3(MAIN_GUI *data, void *(*malloc_adr)(int), void (*mfree_adr)(void *)){ data->gui.state=2;} 
void method4(MAIN_GUI *data, void (*mfree_adr)(void *)){ if (data->gui.state!=2) return; data->gui.state=1;} 
int method5(MAIN_GUI *data, GUI_MSG *msg){ 
return onkey(msg->gbsmsg->submess, msg->gbsmsg->msg);} 
void method7(MAIN_GUI *data, void (*mfree_adr)(void *)){}// mfree_adr(data); 
int method8(void){return(0);} //  - 
int method9(void){return(0);} //  - 

const void * const gui_methods[11]={ 
(void *)method0, //Redraw 
(void *)method1, //Create 
(void *)method2, //Close 
(void *)method3, //Focus 
(void *)method4, //Unfocus 
(void *)method5, //OnKey 
0, 
(void *)method7, //Destroy 
(void *)method8, 
(void *)method9, 
0 
}; 

const RECT Canvas={0,0,131,175}; 

void maincsm_oncreate(CSM_RAM *data) 
{ 
MAIN_GUI *main_gui=malloc(sizeof(MAIN_GUI)); 
MAIN_CSM*csm=(MAIN_CSM*)data; 
zeromem(main_gui,sizeof(MAIN_GUI)); 
// ustk=malloc(STKSZ); //   
// info_ws=AllocWS(512); 
main_gui->gui.canvas=(void *)(&Canvas); 
main_gui->gui.flag30=2; 
main_gui->gui.methods=(void *)gui_methods; 
main_gui->gui.item_ll.data_mfree=(void (*)(void *))mfree_adr(); 
csm->csm.state=0; 
csm->csm.unk1=0; 
csm->gui_id=CreateGUI(main_gui); 
} 

void Killer(void){ 
extern void *ELF_BEGIN; 
extern void kill_data(void *p, void (*func_p)(void *)); 
onexit(); 
kill_data(&ELF_BEGIN,(void (*)(void *))mfree_adr()); 
// ((void (*)(void *))(mfree_adr()))(&ELF_BEGIN); 
} 

void maincsm_onclose(CSM_RAM *csm) 
{ 
onclose(); 
SUBPROC((void *)Killer); 
} 

int maincsm_onmessage(CSM_RAM *data, GBS_MSG *msg){ 
MAIN_CSM *csm=(MAIN_CSM*)data; 
if ((msg->msg==MSG_GUI_DESTROYED)&&((int)msg->data0==csm->gui_id)) 
csm->csm.state=-3; 
return(1); 
} 

const int minus11=-11; 
unsigned short maincsm_name_body[140]; 

const struct 
{ 
CSM_DESC maincsm; 
WSHDR maincsm_name; 
}MAINCSM = 
{ 
{ 
maincsm_onmessage, 
maincsm_oncreate, 
#ifdef NEWSGOLD 
0, 
0, 
0, 
0, 
#endif 
maincsm_onclose, 
sizeof(MAIN_CSM), 
1, 
&minus11 
}, 
{ 
maincsm_name_body, 
NAMECSM_MAGIC1, 
NAMECSM_MAGIC2, 
0x0, 
139 
} 
}; 

int main(char *exename, char *fname){ 
char dummy[sizeof(MAIN_CSM)]; 
if(onstart(exename,fname)) SUBPROC((void *)Killer); 
else CreateCSM(&MAINCSM.maincsm,dummy,0); 
return 0; 
} 

  ( )  main.c: 
// Main.c 0.1 
// Demo 3:  :   ,    

#include "E:\ARM\swilib.h" 
extern short screen[132*176]; //  132*176*2 
extern void DrawScreen(); //    
void onredraw(void); 

//#define RGB8(R,G,B) (B+(G<<2)+(R<<5)) 
#define RGB16(R,G,B) ((B>31?31:B)+((G>63?63:G)<<5)+((R>31?31:R)<<11)) 

char *buf=0; // -  (   ) 
int bufsize=10000; //   
volatile int started=0; //       =0 
int color=0; 

GBSTMR timer; 
void timer_proc(void){ //     10    
if(started){ 
REDRAW(); //   
} 
GBS_StartTimerProc(&timer,262/10,timer_proc); //     10    
//         
} 

void execute(){ //   
started=1; 
while(started){ //      
onredraw(); //   ,    -  
} 
} 

int onstart(char *exename, char *fname){ //  .  0  1  . 
// if(!fname) return 1; //       
buf=(char *)malloc(bufsize); //    .. 
if(!buf) return 1; //   -  
//   - 
return 0; 
} 

void oncreate(){ //   
SUBPROC((void *)execute); //    
GBS_StartTimerProc(&timer,262/10,timer_proc); //     10    
} 

void onclose(){ //   
started=0; //      
GBS_StopTimer(&timer); //   
//     
} 

void onexit(){ //  
if(buf) mfree(buf); //   
} 

void onredraw(void){ //   screen[132*176] 
int i,j; 
for(i=0,j=color++;i<132*176;i++){ 
screen[i]=j++; 
} 
} 

// keycode -  , pressed - // 
int onkey(unsigned char keycode, int pressed){ //  .  0  1   
switch(pressed){ 
case KEY_UP: break; //   
case LONG_PRESS: //    () 
case KEY_DOWN: //   
switch(keycode){ //   
case RED_BUTTON: return 1; //  
case LEFT_SOFT: case RIGHT_BUTTON: case UP_BUTTON: case ENTER_BUTTON: //  - 
case '0': case '9': case '#': case '*': break; 
default: return 0; 
} 
onredraw(); DrawScreen(); //   
} 
return 0; 
} 
//#define MSG_GUI_DESTROYED 152 //  s75      swilib.h 


8.  4.   
[...] 

9. FAQ 
    Rst7 ( :) 

-   iar cu  char c[100]; int a=*(int*)(c+5)  ? 
     int    -     -  ...     ,        . 

-        mfree()? 
,   -  

-            ? 
 ...  BLX R4   ,      ... 

-   SUBPROC ? REDRAW ? 
SUBPROC -           ,    GUI,   -   (  TED\'  ,  MegaDial\'     ) 
REDRAW -   onRedraw  GUI (   -) 

  cbn: 
-   /? 
TDate date; TTime time; 
GetDateTime(&date,&time); 
sprintf(s,"%d:%02d",time.hour,time.min); 
sprintf(ss,"%02d-%02d-%04d",date.day, date.month,date.year); 

- IAR :   div_32a (  ELF_BEGIN) 
       div.r79  func.asm 

-     -    ? 
       -         .      ,    .       . 
    -          (80%    20% )   . 

:   func.asm  myfunc(a,b,c,d) 
  ELF_BEGIN   
    PUBLIC myfunc 
myfunc: PUSH {R4-R6,LR} 
    ; -  R4-R6 (  R12) 
    POP {R4-R6,PC} ;  
    ;  BX LR    
  : 
extern int myfunc(int a,int b,int c, int d); 
myfunc(a,b,c,d); 
 4   .   R0-R3,   . 
   R0. 
       

-   65-75      (MMC)? 
 fopen()   P_READ  0 

-      bmp? 
.  

-          ? 
.  

-     IAR ? 
. .  

-  ? 
   :(   
       
char s[128]; sprintf(s," a= %d",a); ShowMSG(1,(int)s); //  DrawString(...) 
   : #define logsize 10000 
char log[logsize], *ptr=log; 
void debug(char *s){ if(ptr<log+logsize-strlen(s)-3){ 
strcpy(ptr,s); ptr+=strlen(s); *ptr++=0xd; *ptr++=0xa;}} 
  : fwrite(f,log,ptr-log,&err); 
   -           . 

-      ? 
void findlist(char *dir){ //dir - ,  "0:","0:\\Misc" 
static DIR_ENTRY de; unsigned int err; 
char path[128]; strcpy(path,dir); 
char *ptr=path+strlen(path)+1; 
strcat(path,"\\*.*"); // "\\*.wav" ..     
if (FindFirstFile(&de,path,&err)){ 
do{ strcpy(ptr,de.file_name); 
//if(isdir(path,&err)) somedir(path); else //     -,  
somefile(path); //       
}while(FindNextFile(&de,&err)); 
}FindClose(&de,&err);} 

-     . ? 
void execelf(char *exename, char *fname){ //fname- ( ),    
WSHDR *ws=AllocWS(256); 
str_2ws(ws,exename,strlen(exename)+1); 
ExecuteFile(ws,0,fname); FreeWS(ws);} 

-    ? 
  Geka: PlaySound(1,0,0,n,0)  n- . 

-    ? 
  KreN (  ): 
typedef struct{ unsigned int unk1,unk2,unk3,volume;} SFO; 
#pragma swi_number=74 
__swi __arm void PlayFile(int _C,WSHDR* folder,WSHDR* filename,int cepid, int _167,SFO* options); 
void PlayMelody(int type_melody){ 
SFO unk1; WSHDR *ws1=AllocWS(50), *ws2=AllocWS(30); 
str_2ws(ws1,natisq_path,49); 
unk1.unk1=1; unk1.unk2=0; unk1.unk3=0; unk1.volume=3; 
wsprintf(ws2,"message.wav"); 
PlayFile(0xC,ws1,ws2,GBS_GetCurCepid(),0x167,&unk1); 
FreeWS(ws1); FreeWS(ws2);} 
PS(cbn):  SFO ,    . ()   ,  ... 

-    float,double,long long,... (  .,     div_32a, div_64a, doubleToLong, float...)? 
Kren:   Project->Options->Library Configuration  Normal.  . . . 
cbn:   -   ( ).         float,double      __. 


 :   (cbn)      
	int f;
int f2;
char *buffer;
  if((f=fopen(ptr,A_ReadOnly+A_BIN,P_READ,&err))!=-1)
     {ShowMSG(1,(int)"");
      buffer = malloc(0x6);
      lseek(f, 0xD, S_SET, &err, &err);
      fread32(f, buffer, 0x60, &err);
      
     }
  else ShowMSG(1,(int)"Can't open");
  
  if( (f2=fopen("0:\\z1.txt",A_ReadWrite+A_BIN+A_Create+A_Append,P_READ+P_WRITE,&err))!=-1) //  
     { ShowMSG(1,(int)"Create");
       fwrite32(f2,buffer,0x60,&err);
       fclose(f2,&err);
     }
  else ShowMSG(1,(int)"Can't creat");
  fclose(f, &err);