Tiny C Compiler

...
  • andrew_programmer
    В данном случае проще было обратиться ко мне. Стандартная библиотека по серьезному не проверялась, поэтому очень может быть, что в ней много багов. Пришли (или выложи) мне неработающий код - буду исправлять.
  • andrew_programmer wrote:Veliant

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

    Кто-нибудь может дать мне прямую ссылку на MinGW(версия GCC под виндовс) ?
    А то я хочу melibc.a пересобрать.
    http://www.filesearch.ru/cgi-bin/s?q=mi ... &x=26&y=13
  • andrew_programmer
    Пробовал писать свою версию _msys_get_key() но всё равно возвращается неправильные коды(к примеру 8230).
    Приведи код функции. Я переписал плеер на С. Может смогу разобраться в чем дело.
  • Вот эта часть кода работает с файлом.

    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 функцию ? Можно взглянуть на ту часть кода,которая работает с файлом ?
  • 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; вызывает ошибку
  • а надпись NULL=(void*)0; вызывает ошибку
    Нулл это вроде константа, изменить её значение естественно нельзя. (если я ничего не путаю)
  • Я использовал свою версию 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);
    
    
  • Serge,спасибо.

    Я так понимаю,что его MinGW надо компилировать.
    Сейчас MinGW докачаю и буду "колдовать" с файлами.
  • В предыдущем сообщении я допустил неточность.
    Сначала компилируется фасмом в объектный файл,а потом из объектных файлов собирается в melibc.a
  • Там нету NULL, даже если бы и был, то if(!fogg) тоже вызывает ошибку.
    А почему melibc.a нельзя скомпилировать metcc?
    И вообще, как делать библиотеки .a в metcc?
  • 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() при изменении данных нужно переключиться на другое приложение, а потом обратно, чтобы увидеть измененную строку.
  • andrew_programmer
    Исправил ошибку в _msys_read_file. Скомпиленный melibc.a можно найти здесь: http://shade.msu.ru/~msu-se/melibc.rar
  • andrew_programmer
    Я компилировал плеер metcc. Сегодня выложу все исходники.
  • Андрей(halyavin),к сожалению и эта версия не работает.
    Длина файла всегда ноль.
    fgetc тоже возвращает 0.
  • Who is online

    Users browsing this forum: No registered users and 4 guests