Veliant
Спасибо,понял.
Проблему ошибок metcc надо решать.
Кто-нибудь может дать мне прямую ссылку на MinGW(версия GCC под виндовс) ?
А то я хочу melibc.a пересобрать.
Tiny C Compiler
andrew_programmer
В данном случае проще было обратиться ко мне. Стандартная библиотека по серьезному не проверялась, поэтому очень может быть, что в ней много багов. Пришли (или выложи) мне неработающий код - буду исправлять.
В данном случае проще было обратиться ко мне. Стандартная библиотека по серьезному не проверялась, поэтому очень может быть, что в ней много багов. Пришли (или выложи) мне неработающий код - буду исправлять.
http://www.filesearch.ru/cgi-bin/s?q=mi ... &x=26&y=13andrew_programmer wrote:Veliant
Спасибо,понял.
Проблему ошибок metcc надо решать.
Кто-нибудь может дать мне прямую ссылку на MinGW(версия GCC под виндовс) ?
А то я хочу melibc.a пересобрать.
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 функцию ? Можно взглянуть на ту часть кода,которая работает с файлом ?
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;
}
}
}
Нулл это вроде константа, изменить её значение естественно нельзя. (если я ничего не путаю)а надпись 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 докачаю и буду "колдовать" с файлами.
Я так понимаю,что его MinGW надо компилировать.
Сейчас MinGW докачаю и буду "колдовать" с файлами.
В предыдущем сообщении я допустил неточность.
Сначала компилируется фасмом в объектный файл,а потом из объектных файлов собирается в melibc.a
Сначала компилируется фасмом в объектный файл,а потом из объектных файлов собирается в melibc.a
Там нету NULL, даже если бы и был, то if(!fogg) тоже вызывает ошибку.
А почему melibc.a нельзя скомпилировать metcc?
И вообще, как делать библиотеки .a в metcc?
А почему melibc.a нельзя скомпилировать metcc?
И вообще, как делать библиотеки .a в metcc?
O01eg
Не поможет? Вообще учти, что это С, а NULL вроде из С++ (могу ошибаться).
melibc.a может быть и можно компилировать metcc, но зачем? Ведь код будет намного хуже, а он будет использоваться в дальнейшем в большом количестве программ.
Библиотеки .a делают с помощью утилиты ar.exe из кучи .o файлов, которые получаются после компиляции.
Твой код у меня не скомпилился из-за остуствия файла "/ogg/ogg.h". После удаления этой строчки ошибка была найдена - функция _msys_get_key() возращает результат в формате менуета, т.е. сам код клавиши равен id_key>>8. После этого исправления редактирование строки работает. Правда из-за отсуствия вызова draw_window() при изменении данных нужно переключиться на другое приложение, а потом обратно, чтобы увидеть измененную строку.
Code: Select all
#define NULL ((void*)0)
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
Исправил ошибку в _msys_read_file. Скомпиленный melibc.a можно найти здесь: http://shade.msu.ru/~msu-se/melibc.rar
andrew_programmer
Я компилировал плеер metcc. Сегодня выложу все исходники.
Я компилировал плеер metcc. Сегодня выложу все исходники.
Андрей(halyavin),к сожалению и эта версия не работает.
Длина файла всегда ноль.
fgetc тоже возвращает 0.
Длина файла всегда ноль.
fgetc тоже возвращает 0.
Who is online
Users browsing this forum: No registered users and 4 guests