Page 4 of 20

Posted: Mon Sep 18, 2006 5:58 pm
by andrew_programmer
Veliant

Спасибо,понял.
Проблему ошибок metcc надо решать.

Кто-нибудь может дать мне прямую ссылку на MinGW(версия GCC под виндовс) ?
А то я хочу melibc.a пересобрать.

Posted: Mon Sep 18, 2006 6:14 pm
by halyavin
andrew_programmer
В данном случае проще было обратиться ко мне. Стандартная библиотека по серьезному не проверялась, поэтому очень может быть, что в ней много багов. Пришли (или выложи) мне неработающий код - буду исправлять.

Posted: Mon Sep 18, 2006 6:15 pm
by Veliant
andrew_programmer wrote:Veliant

Спасибо,понял.
Проблему ошибок metcc надо решать.

Кто-нибудь может дать мне прямую ссылку на MinGW(версия GCC под виндовс) ?
А то я хочу melibc.a пересобрать.
http://www.filesearch.ru/cgi-bin/s?q=mi ... &x=26&y=13

Posted: Mon Sep 18, 2006 6:27 pm
by Serge
andrew_programmer
Пробовал писать свою версию _msys_get_key() но всё равно возвращается неправильные коды(к примеру 8230).
Приведи код функции. Я переписал плеер на С. Может смогу разобраться в чем дело.

Posted: Fri Sep 22, 2006 3:52 pm
by andrew_programmer
Вот эта часть кода работает с файлом.

float spektors[2][2048];

int LoadSpektr(char *filename)
{
FILE *f;
int stroka[20];
int k,counter,i,j,s,spektr_pos;
long value;
float dec,stepen;
int number;

// open file with spektr
f=fopen(filename,"r");

j=0;
spektr_pos=0;
//load spektr from file to memory
while((s=fgetc(f))!=EOF)
{
//load string from file
if (s!='\n')
{
s=s-'0';
stroka[counter]=s;
counter++;
}

//convert string to float number
if (s=='\n')
{
dec=0;
for(k=0;k<counter;k++)
{
s=stroka[k];
value=(s & 0xff);
stepen=1;
if (counter-k>0)
{
for(i=1;i<(counter-k);i++)
{stepen=stepen*10;}
}
else {stepen=1;}
dec=dec+(stepen*value);
}
//save converted number in array of spektors
spektors[j][spektr_pos]=dec;
spektr_pos++;
counter=0;
}

}

fclose(f);
return(spektr_pos);
}

А с клавиатурой я разобрался.После того,как я перераспаковал архив,глюки с неработающей клавиатурой исчезли.


Кажется я понял почему работа с файлами не работает.Взгляните на эту часть кода:
format ELF
section '.text' executable
public _msys_read_file
_msys_read_file:
;arg1 - file name
;arg2 - file offset
;arg3 - size to read
;arg4 - data
;arg5 - file size
push ebp
mov ebp,esp
xor eax,eax
mov [file_struct.operation],eax
mov eax,[ebp+12]
mov [file_struct.offset],eax
mov eax,[ebp+16]
mov [file_struct.offset],eax
mov eax,[ebp+20]
mov [file_struct.offset],eax
mov [file_struct.temp_buffer],temp_buffer
mov edx,[ebp+8]
call copy_file_name
push ebx
mov ebx,file_struct
mov eax,58
int 0x40
mov ecx,[ebp+24]
test ecx,ecx
jz .no_file_size
mov [ecx],ebx
.no_file_size:
pop ebx
pop ebp
ret 20

copy_file_name:
push esi edi
cld
mov edi,edx
xor eax,eax
xor ecx,ecx
dec ecx
repnz scasb
not ecx
mov edi,file_struct.path
mov esi,edx
rep movsb
pop edi esi
ret

file_struct:
.operation rd 1
.offset rd 1
.param:
.size rd 1
.data rd 1
.temp_buffer rd 1
.path rb 1024
temp_buffer rb 4096

Как видно,параметры в поле offset записывается три раза.Хотя некоторые параметры(например указатель на область куда загружать файл) должны записываться в другие поля.Сегодня попробую пересобрать часть melibc.a(ту её часть,которая мне нужна для работы).

Serge,а ты для работы MP3 плеера использовал 70 функцию ? Можно взглянуть на ту часть кода,которая работает с файлом ?

Posted: Fri Sep 22, 2006 5:35 pm
by O01eg

Code: Select all

#include "stdio.h" 
#include "string.h" 
#include "mesys.h" 
#include "ogg/ogg.h"

#define FONT0      0 
#define FONT1      0x10000000 

#define BT_NORMAL   0 
#define BT_DEL      0x80000000 
#define BT_HIDE      0x40000000 
#define BT_NOFRAME   0x20000000 

char header[]={" -= OGG demo programm. Compiled whith TCC 0.9.23 halyavin port. Use libogg-1.1.2 =-   "}; 

char sz_demo_start[]={"START"};

char sz_open_file[256];
char p_sz_open_file=0;

FILE *fogg;

void draw_window()
{ 
   static int offs = 0; 
   static int fcolor = 0; 
   static int col = 0; 
   int i; 
   _msys_window_redraw(1); 
   _msys_draw_window(100, 100, 640, 480, 0xaabbcc, 2, 0x5080d0, 0, 0x5080d0); 
   _msys_write_text(6 - offs, 8, fcolor | FONT0, header, strlen(header)); 
   _msys_draw_bar(1, 6, 5, 13, 0x05080d0); 
   _msys_draw_bar(274, 6, 26, 13, 0x05080d0); 
   _msys_make_button(640 - 16, 5, 12, 12, 1 | BT_NORMAL, 0x6688dd);
   _msys_make_button(20, 25, 32, 12, 2 | BT_NORMAL, 0x6688dd);
   _msys_write_text(21, 26, fcolor | FONT0, sz_demo_start, strlen(sz_demo_start)); 
   _msys_write_text(40, 40, fcolor | FONT0, sz_open_file, strlen(sz_open_file));
   _msys_window_redraw(2); 
} 

void ogg_demo(void)
{
}

int main(int argc, char **argv)
{ 
   int id_button;
   int id_key;
   while(!0)
   { 
      switch(_msys_wait_for_event_infinite())
      { 
      case 2:
         id_key=_msys_get_key();
         if(id_key==8)
         {
            if(p_sz_open_file>0)
               {
                  sz_open_file[p_sz_open_file]=0;
                  p_sz_open_file--;
               }
         }
         if(id_key!=8)
         {
            if(p_sz_open_file<255)
               {
                  sz_open_file[p_sz_open_file]=id_key;
                  p_sz_open_file++;
                  sz_open_file[p_sz_open_file]=0;
               }
         }
         break; 

      case 3:
         id_button=_msys_get_button_id(); 
         if(id_button == 1) return 0; 
         if(id_button == 2) ogg_demo();
         break; 
          
      default: 
         draw_window(); 
         break; 
      } 
   } 
}
люди вот ещё код, там используется получение букв с клавиатуры, и удаление на BackSpace, но почему-то, в емуляторе не работает. кроме того отсутствует NULL, а надпись NULL=(void*)0; вызывает ошибку

Posted: Fri Sep 22, 2006 5:51 pm
by vectoroc
а надпись NULL=(void*)0; вызывает ошибку
Нулл это вроде константа, изменить её значение естественно нельзя. (если я ничего не путаю)

Posted: Fri Sep 22, 2006 6:26 pm
by Serge
Я использовал свою версию read_file();

Code: Select all

format ELF
include "proc32.inc"
section '.text' executable

public read_file

struc FILEIO
{   .cmd            dd ?
    .offset         dd ?
                    dd ?
    .count          dd ?
    .buff           dd ?
                    db ?
    .name           dd ?
};


align 4
proc read_file stdcall,name:dword, buff:dword, offset:dword,count:dword

           xor eax, eax
           mov ebx, [name]
           mov edx, [offset]
           mov esi, [buff]
           mov edi, [count]

           mov [fileio.cmd], eax
           mov [fileio.offset], edx
           mov [fileio.offset+4], eax
           mov [fileio.count], edi
           mov [fileio.buff], esi
           mov byte [fileio.buff+4], al
           mov [fileio.name], ebx

           mov eax, 70
           lea ebx, [fileio]
           int 0x40

           ret
endp

align 4
fileio FILEIO

//////////// C header

extern int stdcall read_file (char *name,char*buff,int offset,int count);


Posted: Fri Sep 22, 2006 6:53 pm
by andrew_programmer
Serge,спасибо.

Я так понимаю,что его MinGW надо компилировать.
Сейчас MinGW докачаю и буду "колдовать" с файлами.

Posted: Fri Sep 22, 2006 7:20 pm
by andrew_programmer
В предыдущем сообщении я допустил неточность.
Сначала компилируется фасмом в объектный файл,а потом из объектных файлов собирается в melibc.a

Posted: Fri Sep 22, 2006 7:39 pm
by O01eg
Там нету NULL, даже если бы и был, то if(!fogg) тоже вызывает ошибку.
А почему melibc.a нельзя скомпилировать metcc?
И вообще, как делать библиотеки .a в metcc?

Posted: Fri Sep 22, 2006 8:12 pm
by halyavin
O01eg

Code: Select all

#define NULL ((void*)0)
Не поможет? Вообще учти, что это С, а NULL вроде из С++ (могу ошибаться).

melibc.a может быть и можно компилировать metcc, но зачем? Ведь код будет намного хуже, а он будет использоваться в дальнейшем в большом количестве программ.

Библиотеки .a делают с помощью утилиты ar.exe из кучи .o файлов, которые получаются после компиляции.

Твой код у меня не скомпилился из-за остуствия файла "/ogg/ogg.h". После удаления этой строчки ошибка была найдена - функция _msys_get_key() возращает результат в формате менуета, т.е. сам код клавиши равен id_key>>8. После этого исправления редактирование строки работает. Правда из-за отсуствия вызова draw_window() при изменении данных нужно переключиться на другое приложение, а потом обратно, чтобы увидеть измененную строку.

Posted: Fri Sep 22, 2006 8:14 pm
by halyavin
andrew_programmer
Исправил ошибку в _msys_read_file. Скомпиленный melibc.a можно найти здесь: http://shade.msu.ru/~msu-se/melibc.rar

Posted: Fri Sep 22, 2006 9:24 pm
by Serge
andrew_programmer
Я компилировал плеер metcc. Сегодня выложу все исходники.

Posted: Fri Sep 22, 2006 10:05 pm
by andrew_programmer
Андрей(halyavin),к сожалению и эта версия не работает.
Длина файла всегда ноль.
fgetc тоже возвращает 0.